代码随想录刷题记录第二天 | 数组 | 209.长度最小的子数组 |59. 螺旋矩阵 II

题目链接:209.长度最小的子数组 - https://leetcode.cn/problems/minimum-size-subarray-sum/description/
59. 螺旋矩阵 II - https://leetcode.cn/problems/spiral-matrix-ii/description/
文章学习链接:https://programmercarl.com/0059.螺旋矩阵II.html#算法公开课

209. 长度最小的子数组

题目内容:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
关键字:连续子数组

解题思路
1、暴力破解
2、滑动窗口

暴力破解
给定一个很大的值subLen,两层遍历,外层遍历数组的每个值,内层确定达到和达到和target的值所需要的长度,拿它和subLen比较,小于则重新赋值

解题代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        // 暴力破解 , 超出时间限制 , 试了试官方的暴力破解也超出时间限制
        int subLen = Integer.MAX_VALUE;
        for(int i = 0,len = nums.length; i<len;i++){
            int sum = 0;
            for(int j = i; j<len;j++){
                sum += nums[j];
                if(sum >= target){
                    subLen = (j - i + 1 <= subLen ? j-i+1 : subLen);
                    break;
                }
            }
        }
        return subLen == Integer.MAX_VALUE ? 0 : subLen;
    }
}

滑动窗口
关键点:是先遍历找到一个满足条件数组和大于s的值才开始移动左边的边界

解题代码

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

注意点:细心点,两次写都忘记相加的是nums[i]而写了相加i


59. 螺旋矩阵 II

题目内容:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

大写的懵逼

解题思路
1、循环次数是n/2

  • 奇数次时每次中间的变量会不被设置到,偶数次可以刚好循环完。

2、设置一个变量记录每次循环开始的起始点位置。
3、处理一圈四条边的时候要保持循环不变量。

解题代码

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;  // 控制循环次数
        int[][] res = new int[n][n];
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字
        int i, j;

        while (loop++ < n / 2) { // 判断边界后,loop从1开始
            // 模拟上侧从左到右
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }

            // 模拟右侧从上到下
            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }

            // 模拟下侧从右到左
            for (; j >= loop; j--) {
                res[i][j] = count++;
            }

            // 模拟左侧从下到上
            for (; i >= loop; i--) {
                res[i][j] = count++;
            }
            start++;
        }

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

还是不太会

posted @   虚拟式  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示