977.有序数组的平方
复习
思路:
【相向双指针法】
1. 平方后,最大的元素一定在数组两端。令 l = 0, r = nums.length-1;
2. 新数组 arr,长度为 nums.length。
3. 比较 l 和 r 所指元素平方项的大小,将更大的那个值加入arr(从后往前)。更新 l 或 r(只要满足 l<=r )。
4. 结束比较时,返回 arr。
要注意的代码细节:
1. 先在 arr 加入元素,再移动 l / r 。
2. 判断大小时,不要漏写“==”的情况(可利用else省略),不然会导致加不进元素。
class Solution {
public int[] sortedSquares(int[] nums) {
int l = 0;
int r = nums.length-1;
int[] arr = new int[nums.length];
for(int i = r; i>=0 ; i--){
if(nums[l]*nums[l]>nums[r]*nums[r]){
arr[i] = nums[l]*nums[l++];
} else {
arr[i] = nums[r]*nums[r--];
}
}
return arr;
}
}
209.长度最小的子数组
复习
思路:
【滑动窗口】
1. 双指针 l 和 r;声明 len 记录最小长度;声明sum记录 l ~ r 的元素之和。
2. 当 sum < target 时,sum 加上当前r所指元素的值,r 右移;当sum >= target 时,sum 减去当前l所指元素的值,l 右移,并更新 len (原 len 和 r-l+1 取最小值)。
3. 当 r > nums.length -1 时,return len。
要注意的代码细节:
1. len 在哪个循环层更新?【只当 sum>=target 时才更新(放在小循环中)。如果从头到尾都没满足过这个条件,就不更新。即 结束循环时,len 依旧等于 Integer.MAX_VALUE】
2. len,sum,l 更新顺序 ?【len,sum,l】
2. 遍历完数组后,return len == Integer.MAX_VALUE? 0:len; 的这种写法。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int l = 0;
int sum = 0;
int len = Integer.MAX_VALUE;
for(int r = 0; r < nums.length; r++){
sum+=nums[r];
while(sum>=target){
len = Math.min(len,r-l+1);
sum-=nums[l++];
}
}
return len == Integer.MAX_VALUE? 0:len;
}
}
59.螺旋矩阵II
复习
思路:
1. i :纵向遍历指针,j :横向遍历指针;二维数组 arr = new int[n][n];
2. 每次循环,走完一个正方形;需要循环n/2次(n为奇数时,还需处理最中间的正方形)。用loop 记录循环次数,loop 属于[1,n/2]。
3. start 表示边的遍历起点下标,start + n - 2*loop 为遍历终点下标。num 表示要填入的数,每次指针移动时,num++。
(1)上边\右边指针边界:[start, start + n- 2*loop]
(2)下边\左边指针边界:[start+1, start + n- 2*loop+1(遍历起点,一定满足)]
4. 若n为奇数,处理最中间的正方形。
要注意的代码细节:
1. arr[i][j],搞清楚 i 和 j 哪个是横向指针、哪个是纵向指针。
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
int num = 1;
for (int start = 0, loop = 1; loop<= n/2; loop++, start++){
int i = start;
int j = start;
while(j <= start+n-2*loop){//上
arr[i][j++] = num++;
}
while(i <= start+n-2*loop){//右
arr[i++][j] = num++;
}
while(j >= start+1){//下
arr[i][j--] = num++;
}
while(i >= start+1){//左
arr[i--][j] = num++;
}
}
if (n%2==1){
arr[n/2][n/2] = n*n;
}
return arr;
}
}