[代码随想录] 第二天

发布时间 2024-01-11 23:57:11作者: 糟糕的家伙

977.有序数组的平方[https://leetcode.cn/problems/squares-of-a-sorted-array/]
思路:因为数组是非递减,数组有正有负,找到第一个非负数设为i,i将数组划分为前部分的负数组,后部分的非负数组,使用辅助数组将原数组平方部分存储,后部分使用正序存储,前部分使用逆序存储,然后再使用类似归并排序思路【双指针】,left =0,right =i,将较小者依次存入nums数组。
时间复杂度:O(N+N)

class Solution {
    int abs(int x) {
        return x * x;
    }

    public int[] sortedSquares(int[] nums) {
        int i = 0;
        int[] ans = new int[nums.length];
        while (i != nums.length && nums[i] < 0) {
            i++;
        }
        for (int j = 0; j < i; j++) {
            ans[j] = abs(nums[i - 1 - j]);
        }
        for (int j = i; j < nums.length; j++) {
            ans[j] = abs(nums[j]);
        }
        int right = i;
        int left = 0;
        int k = 0;
        while (left < i && right < nums.length) {
            if (ans[left] <= ans[right]) {
                nums[k] = ans[left];
                k++;
                left++;
            } else {
                nums[k] = ans[right];
                k++;
                right++;
            }
        }
        while (left < i) {
            nums[k] = ans[left];
            k++;
            left++;
        }
        while (right < nums.length) {
            nums[k] = ans[right];
            right++;
            k++;
        }
        return nums;

    }
}

上部分为本能思路,写法过于啰嗦,整理借鉴后。
简洁思路:负数数组越靠左,平方越大,非负数数组越靠右,平方越大。数组两边左右指针,依次取平方较大者,从高位向低位输入辅助数组。
【创造正序数组时,不仅可以从低位向高位依次存入小值,也可以从高位到低位依次输入大值】
时间复杂度:O(N)

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

------------------分割线-------------------
209. 长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/description/
思路:使用双指针【滑动窗口】,right和left,right-left+1 是最小子数组的长度,sum用于保存当前窗口内和,若sum>target,窗口缩小,若sum<target,窗口扩大。

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

------------------分割线-------------------
59.螺旋矩阵Ⅱhttps://leetcode.cn/problems/spiral-matrix-ii/description/
思路:没什么好说的?

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        int loop = n / 2;
        int count = 1;
        int i = 0;
        while (i < loop) {
            for (int j = i; j < n - i - 1; j++) {
                ans[i][j] = count++;
            }
            for (int j = i; j < n - i - 1; j++) {
                ans[j][n - i - 1] = count++;
            }
            for (int j = n - i - 1; j > i; j--) {
                ans[n - i - 1][j] = count++;
            }
            for (int j = n - i - 1; j > i; j--) {
                ans[j][i] = count++;
            }
            i++;
        }
        if (n % 2 != 0) {
            ans[n / 2][n / 2] = count++;
        }
        return ans;
    }
}

使用IDEA,一边输出一边调试,左开右闭!