代码随想录算法训练营第二天|Leetcode977、209、59

127 阅读1分钟

尴尬的是第二天的题也做过了

977.有序数组的平方

题目链接:leetcode.cn/problems/sq…

这道题用双指针就好做出来了,左右比较大小

class Solution {
    //双指针
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        int left = 0, right = len - 1;
        int index = len - 1;
        int [] res = new int[len];
        while(left <= right) {
            if(nums[left] * nums[left] >= nums[right] * nums[right]) {
                res[index--] = nums[left] * nums[left];
                left++;
            } else {
                res[index--] = nums[right] * nums[right];
                right--;
            }
        }
        return res;
    }
}

209.长度最小的子数组

题目链接:leetcode.cn/problems/mi…

暴力法的时间复杂度是O(n^2),滑动窗口法的话只需要O(n)

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

59.螺旋矩阵II

题目链接:leetcode.cn/problems/sp…

模拟题,模拟转圈圈就好了,主要while的条件是num <= n^2

class Solution {
    public int[][] generateMatrix(int n) {
        //模拟法,设定边界
        int tar = n * n;
        int t = 0, b = n -1, l = 0, r = n - 1;
        int num = 1;
        int[][] res = new int[n][n];
        while(num <= tar) {
            for(int i = l; i <= r; i++)res[t][i] = num++;
            t++;
            for(int i = t; i <= b; i++)res[i][r] = num++;
            r--;
            for(int i = r; i >= l; i--)res[b][i] = num++;
            b--;
            for(int i = b; i >= t; i--)res[i][l] = num++;
            l++;
        }
        return res;
    }
}