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

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

思路:一开始自己写还是冒泡。看了代码以后发现还有一种新思路,双指针来完成。

双指针:创建一个新数组,判断最左边和最右边两个平方后的大小,谁大就给新数组赋值。赋值到最后就是递增排序了,之前的暴力for循环后用冒泡或者是快排的时间复杂度都比这个慢,这个是n。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int right = nums.length - 1;
        int left = 0;
        int[] result = new int[nums.length];
        int index = result.length - 1;
        while (left <= right) {
            if (nums[left] * nums[left] > nums[right] * nums[right]) {
                // 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
                result[index--] = nums[left] * nums[left];
                ++left;
            } else {
                result[index--] = nums[right] * nums[right];
                --right;
            }
        }
        return result;
    }
}

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

思路:之前了解过,所以开始想的就是滑动窗口,一个for循环来从0判断到末尾,如果>=target值就把最左侧值减去,也就是减去一开始加上的起始值,这样窗口才能滑动起来,不满足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;
    }
}

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

思路:设定矩阵的4个边角,每循环一次都要将对应的边角进行加/减

问题:对具体代码不清晰,其实整体代码就像一个魔方一样,分成四个边,每个边写完就该写里面那层,所以边界是变化的,顶层写完就应该top++,右边写完就应该right--,底边写完就应该bottom++,左边写完应该left++;

package leetcode.editor.cn;

import java.util.*;
public class ID59SpiralMatrixIi{
    public static void main(String[] args) {
        Solution solution = new ID59SpiralMatrixIi().new Solution();
        StringBuilder sb = new StringBuilder();
        
        //执行测试
        
        System.out.println(sb);        
    }
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[][] generateMatrix(int n) {
        int left = 0,top = 0,right = n-1,bottom = n-1;
        int [][]nums=new int[n][n];
        int dight = 1;
        int end = n*n;
        while(dight<=end){
            //左——>右
            for(int i=left;i<=right;i++){
                nums[top][i]=dight++;
            }
            top++;
            //上-->下
            for(int i=top;i<=bottom;i++){
                nums[i][right]=dight++;
            }
            //右-->左
            right--;
            for(int i=right;i>=left;i--){
                nums[bottom][i]=dight++;
            }
            bottom--;
            //下-->上
            for (int i = bottom;i>=top;i--){
                nums[i][left]=dight++;
            }
            left++;

        }
        return nums;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}

 

posted @ 2024-02-19 03:00  22软工冷薄  阅读(3)  评论(0编辑  收藏  举报