Leetcode打卡日记(2020.3.21-2020.3.25)

备注

近期逐步适应直接在leetcode上打代码,不过判题速度确实有点慢,等到实习有工资后开个会员吧…

2020.3.21 水壶问题(365)

有两个容量分别为 x升和 y升的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好z升的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升水。
数学方法:
每次操作只会让桶里的水总量增加x,增加y,减少x,或者减少y;所以所取水量z应为z=ax+by,a、b为整数。贝祖定理:ax+by=z有解当且仅当z是x、y的最大公约数的倍数。
另外考虑几种特殊情况,当x+y<z时,两个桶加起来都无法取到z水量;当z=0时,无论x、y,始终能取到(不取);当x == 0(y == 0)时,只有z == y(z ==x )或z == 0才能取到。

2020.3.22 使数组唯一的最小增量(945)

给定整数数组A,每次move操作将会选择任意A[i],并将其递增1。返回使A中的每个值都是唯一的最少操作次数。
官方题解二的做法:
先快排,然后遍历数组;
如果A[i-1]<A[i],则区间[A[i-1]+1,A[i]]里的数使没有出现过的,所以可将之前重复的数变为这个区间范围内的数。如果之前重复的数是a和b,那么增量就是A[i-1]-a+1和A[i-1]-b+2,但是如果这么做的话就要额外空间保存a和b,所以我们在之前确定重复的数是a和b的时候就可以先-a和-b,然后有空间时才进行+A[i-1]+A[i-1]+1+2。
所以这个操作流程是:
将数组排完序后,我们对数组进行线性扫描,会有两种情况:如果 A[i - 1] == A[i],我们将操作次数减去 A[i],并将重复的数的个数增加 1;如果 A[i - 1] < A[i],则最多可以做这个空白区间中添加temp=min(taken,A[i]-A[i-1]-1)个数,则result+=(A[i-1]temp+temp(temp-1)/2)。

2020.3.23 链表的中间结点(876)

给定一个带有头结点head的非空单链表,返回链表的中间结点,如果有两个中间结点,则返回第二个中间结点。
思路,快慢指针,快指针是慢指针移动速度的两倍,当快指针到达末端时慢指针指向中间节点。

2020.3.24 按摩师(面试题17.16)

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
动态规划,temp[0][i]表示第i天不接时,到第i天的最大分钟数,temp[1][i]表示第i天接时,到第i天的最大分钟数。
那么递推公式就是temp[0][i]=Math.max(temp[0][i-1],temp[1][i-1]);temp[1][i]=temp[0][i-1]+nums[i];
总的最大分钟数就是Math.max(temp[0][len-1],temp[1][len-1])。

2020.3.25 三维形体的表面积(892)

输入整数数组arr,找出其中最小的k个数
Arrays.sort(arr);return Arrays.copyOfRange(arr,0,k);
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。
题意很难读懂,copy一张网上的图,这是[[1,2],[3,4]]的情况,表面积为34。

遍历数组,对于grid[i][j],
计算x=Math.abs(grid[i][j]-grid[i][j-1])和y=Math.abs(grid[i][j]-grid[i-1][j]),x和y就是在[i,j]的长方体和左下两个相邻长方体的边界的表面积;
除此之外如果grid[i][j]>0,那么还会有上下两面1*2=2;
最后等整个数组遍历完发现,还剩这个三维形体的右上两面的表面积没有计算。

	public int surfaceArea(int[][] grid) {
	        int result=0;
	        int H=grid.length;if(H==0)return 0;
	        int W=grid[0].length;if(W==0)return 0;
	        for(int i=0;i<H;i++){
	            for(int j=0;j<W;j++){
	                if(j-1>=0){
	                    result+=Math.abs(grid[i][j]-grid[i][j-1]);
	                }else{
	                    result+=grid[i][j];
	                }
	                if(i-1>=0){
	                    result+=Math.abs(grid[i][j]-grid[i-1][j]);
	                }else{
	                    result+=grid[i][j];
	                }
	                if(grid[i][j]!=0){
	                    result+=2;
	                }
	            }
	        }
	        for(int i=0;i<H;i++){
	            result+=grid[i][W-1];
	        }
	        for(int j=0;j<W;j++){
	            result+=grid[H-1][j];
	        }
	        return result;
    }
发布了11 篇原创文章 · 获赞 0 · 访问量 312

猜你喜欢

转载自blog.csdn.net/weixin_42379024/article/details/105094446