977
有序数组的平方
双指针思想,左边右边分别往中间走,比较大小后再决定是否移动指针
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int k = nums.length-1;
int[] result = new int[nums.length];
while(left<=right){
if(nums[left]*nums[left]<nums[right]*nums[right]){
result[k--] = nums[right]*nums[right];
right--;
}else{
result[k--] = nums[left]*nums[left];
left++;
}
}
return result;
}
}
209
长度最小的子数组
思想是移动末端指针,sum满足条件后移动前端指针,找寻最小长度,要注意的是前端指针不是每次都从0开始的,第一次做题错误出现于sum = sum - nums[i++];i忘记++
return result == len ? 0:result;判断result是否等于len,如果等于则返回0 ,如果不等于则返回result。
public int minSubArrayLen(int s, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= s) {
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
错误代码:
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int right = 0;
int len = Integer.MAX_VALUE;
int sum = 0;
int result = Integer.MAX_VALUE;
for(right = 0;right<nums.length;right++){
sum = sum + nums[right];
while(sum>=target){
result = Math.min(len, right - left + 1);
这里不可以是len,应该是更新之后的result,否则就是每次和最长的比,
应该和更新之后的短的比
sum = sum - nums[left++];
}
}
return result == len ? 0:result;
}
59.螺旋矩阵II
还不熟练,二刷时候再好好看看,要理解其中的逻辑顺序
public int[][] generateMatrix(int n) {
int start = 0;
int[][] res = new int[n][n];
int i,j;
int loop = 0;
int count = 1 ;
while(loop++<n/2){
for(j=start;j<n-loop;j++){
res[start][j] = count++;
}
for(i=start;i<n-loop;i++){
res[i][j] = count++;
}
for(;j>start;j--){
res[i][j] = count++;
}
for(;i>start;i--){
res[i][j] = count++;
}
start++;
}
if(n%2==1){
res[start][start] = n*n;
}
return res;
}