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

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

目录

    • 代码随想录算法训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
      • 题目
      • 一、力扣704. 二分查找
      • 二、209.长度最小的子数组
      • 三、59.螺旋矩阵II

题目

一、力扣704. 二分查找

题目链接

思路:平方后左右对称,使用双指针法,头尾比较出最大者从尾部插入新数组

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0, right = nums.length - 1, k = right;
        int [] newNums = new int[nums.length];
        while (left <= right){
            if (nums[left] * nums[left] >= nums[right] * nums[right]) {
                newNums[k] = nums[left] * nums[left];
                left++;
            }else if (nums[left] * nums[left] < nums[right] * nums[right]) {
                newNums[k] = nums[right] * nums[right];
                right--;
            }
            k--;
        }
        return newNums;
    }
}

二、209.长度最小的子数组

题目链接
思路:暴力也是窗口,只不过是全部遍历,优化一下使用滑动窗口,左右指针初始为0,只要窗口内部和小于目标值,右指针就可以一直向右走,内部和大于目标值的时候左指针才向右走,右指针走到数组尾部遍历便结束。

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

三、59.螺旋矩阵II

题目链接

思路:由于是螺旋矩阵,所以要找规律,构造一样的子问题,采用左闭右开的区间,四边循环,构成一个圈,往后的每一圈都是由左闭右开区间四边循环成的,边界条件即为循环圈数的一半。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums = new int[n][n];   
        // 循环圈次数
        int loop = 0;
        int start = 0;
        int count = 1;
        int i, j;
        while (loop++ < n / 2) {

            for (j = start; j < n - loop; j++) {
                nums[start][j] = count++;
            }

            for (i = start; i < n - loop; i++) {
                nums[i][j] = count++;
            }

            for (; j >= loop; j--) {
                nums[i][j] = count++;
            }

            for (; i >= loop; i--) {
                nums[i][j] = count++;
            }

            start++;
        }

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

你可能感兴趣的:(算法,矩阵,leetcode)