[豪の算法奇妙冒险] 代码随想录算法训练营第二天 | 209-长度最小的子数组、59-螺旋矩阵II

代码随想录算法训练营第二天 | 209-长度最小的子数组、59-螺旋矩阵II


LeetCode209 长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html

视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

​ 一开始用的两层for循环,尝试暴力遍历求解,但最后不出意料的超时了:

image-20251120145641692

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minlen = nums.length + 1;
        for(int i = 0;i < nums.length;i++){
            int sum = 0;
            int curlen = 0;
            for(int j = i;j < nums.length;j++){
                sum += nums[j];
                curlen++;
                if(curlen >= minlen || sum >= target){
                    break;
                }
            }
            if(sum >= target && curlen < minlen){
                minlen = curlen;
            }
        }

        if(minlen > nums.length){
            return 0;
        }else{
            return minlen;
        }
    }
}

​ 然后看了讲解视频,发觉使用双指针滑动窗口的思路解决这道题会更加合适

​ 用滑动窗口,可以用一个for代替暴力求解的两个for

​ 关键在于确定如何移动起始位置,然后持续向后移动,更新滑动窗口的大小

image-20251120145920114

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minlen = nums.length + 1;
        int i = 0;
        int sum = 0;
        for(int j = 0;j < nums.length;j++){
            sum += nums[j];
            while(sum >= target){
                int curlen = j-i+1;
                if(minlen > curlen){
                    minlen = curlen;
                }
                sum -= nums[i];
                i++;
            }
        }

        if(minlen > nums.length){
            return 0;
        }else{
            return minlen;
        }
    }
}

LeetCode59 螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html

视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

​ 这题就是要明确循环不变量,确定好一套边界处理规则

​ 把边界条件搞清晰,这题也就迎刃而解了

image-20251120162931222

class Solution {
    public int[][] generateMatrix(int n) {
        int startI = 0,startJ = 0,offset = 1;
        int cnt = 1;
        int loop = n/2;

        int[][] result = new int[n][n];

        while(true){
            loop--;
            if(loop < 0){
                break;
            }
            int i = startI;
            int j = startJ;

            for(;j < n-offset;j++){
                result[startI][j] = cnt++;
            }
            for(;i < n-offset;i++){
                result[i][n-offset] = cnt++;
            }
            for(;j > startJ;j--){
                result[n-offset][j] = cnt++;
            }
            for(;i > startI;i--){
                result[i][startJ] = cnt++;
            }

            startI++;
            startJ++;
            offset++;
        }

        if(n%2 == 1){
            result[n/2][n/2] = cnt;
        }

        return result;
    }
}

扩展题目:KamaCode58 区间和、KamaCode44 开发商购买土地

扩展题目留着周末再另外做...

posted @ 2025-11-20 16:45  SchwarzShu  阅读(1)  评论(0)    收藏  举报