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

977.有序数的平方 

题目链接:力扣

解题思路:双指针

①定义左右指针
②创建新数组,大小和旧数组一样
③循环:
若右指针指向的数的平方大于左边,则在新数组下标j处加入此数,新数组下标j--,右指针right--
若左指针指向的数的平方大于右边,则在新数组下标j处加入此数,新数组下标j--,左指针left++

代码如下:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int l = 0;
        int r = nums.length - 1;
        int[] res = new int[nums.length];
        int j = nums.length - 1;
        while(l <= r) {
            if(nums[l] * nums[l] <= nums[r] * nums[r]){
                res[j--] = nums[r] * nums[r--];
            } else {
                res[j--] = nums[l] * nums[l++];
            }
    
        }
        return res;
    }
}

209.长度最小的子数组

题目链接:力扣

解题思路:滑动窗口 双指针

①移动结束位置:窗口内的数小于目标值且未到最后一个数
②移动起始位置:窗口内的数大于等于目标值

代码如下:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int i = 0;
        int res = Integer.MAX_VALUE;
        for (int j = 0; j < nums.length; j++) {
            sum += nums[j];
            while(sum >= target){
                int subL = j - i + 1;
                res = Math.min(res, subL);
                sum -= nums[i];
                i++;
            }
        }
        return res == Integer.MAX_VALUE ? 0 : res;

    }   
}

 59.螺旋矩阵II

题目链接:力扣

解题思路:

①分区间:左到右,上到下,有到左,下到上,都是左闭右开,避免重复
②确定循环次数:n/2,若n为奇数,需单独给中心元素赋值

class Solution{
    public int[][] generateMatrix2(int n) {
        int loop = 0;
        int start = 0;
        int count = 1;
        int[][] res = new int[n][n];
        int i,j;
        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 >= loop; j--){
                res[i][j] = count++;
            }
            for(; i >= loop; i--){
                res[i][j] = count++;
            }
            start++;

        }
        if(n % 2 == 1){
            res[start][start] = count;
        }
        return res;
    }
}

今日心得

学习了滑动窗口的思想并加深了双指针的练习。做螺旋矩阵时把自己绕进去了,没有理清楚loop和start的作用,还需要多加思考。

世间皆苦,唯有自渡。

你可能感兴趣的:(算法,矩阵,数据结构)