代码随想录算法训练营第二天|977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II,总结

977.有序数组的平方

977. 有序数组的平方 - 力扣(LeetCode)

复习

思路:

【相向双指针法】

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.长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)

复习

思路:

【滑动窗口】

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

59. 螺旋矩阵 II - 力扣(LeetCode)

复习

思路:

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;
    }
}

总结:

感谢 代码随想录知识星球 (opens new window)海螺人 (opens new window)所画的图!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值