代码随想录刷题Day3

65 阅读2分钟

数组

  1. 209. 长度最小的子数组
  • 暴力解法,力扣超时
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length;
        int count=0;//子序列的长度,中间变量,用于与res对比;
        int res=n+1;// 最终结果,先随便定义一个
        int sum=0;//子序列的数值之和
        for(int i=0;i<n;i++){
            sum=0;
            for(int j=i;j<n;j++){
                sum+=nums[j];
                if(sum>=target){
                    count=j-i+1;
                    res=Math.min(res, count);
                    break;
                }
            }
        }
        return res == n+1 ? 0 : res;
    }
}
  • 滑动窗口
  • 窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
  • 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
  • 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
  • 就是说for循环索引用结束位置,用起始位置思路就跟暴力一样了。代码随想录的图画的很形象,看几遍就懂了。programmercarl.com/0209.%E9%95…
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length;
        int count=0;//子序列的长度,中间变量,用于与res对比;
        int res=n+1;// 最终结果,先随便定义一个
        int sum=0;//子序列的数值之和
        int i=0;//起始位置
        for(int j=0;j<n;j++){//先滑终止位置
            sum+=nums[j];
            while(sum>=target){//再滑起始位置
                count=j-i+1;
                res=Math.min(res, count);
                sum-=nums[i];
                i++;
            }
        }
        return res == n+1 ? 0 : res;
    }
}
  1. 59. 螺旋矩阵 II
  • 力扣上的精选答案,比代码随想录的清晰 leetcode.cn/problems/sp…

    1. 定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n
    1. 当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后: 执行 num += 1,得到下一个需要填入的数字;更新边界,例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
    1. 使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。//这地方不是很懂,我用l < r || t < b也能过
    1. 最终返回 mat 即可。 image.png
class Solution {
    public int[][] generateMatrix(int n) {
        int l=0,r=n-1,t=0,b=n-1;
        int[][] mat= new int[n][n];
        int num=1,tar=n*n;
        while(num <= tar){
            for(int i=l;i<=r;i++){
                mat[t][i]=num;
                num++;
            }
            t++;
            for(int i=t;i<=b;i++){
                mat[i][r]=num;
                num++;
            }
            r--;
            for(int i=r;i>=l;i--){
                mat[b][i]=num;
                num++;
            }
            b--;
            for(int i=b;i>=t;i--){
                mat[i][l]=num;
                num++;
            }
            l++;
        }
        return mat;
    }
}