算法打卡Day2 (补卡)| 数组篇-长度最小的子数组、 螺旋矩阵

35 阅读1分钟

长度最小的子数组

题目链接:leetcode.cn/problems/mi…

关键词:滑动窗口

解题思路

  • 我的解法
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int i = 0;
        int result = Max.;
        for(int j=0; j<nums.length-1; j++){
            int sum = 0;
            int subLength = 0;
            sum += 求i-j之间的和
            if(sum >= target){
                subLength = j - i + 1;
                result = min(result, subLength);
                i++;
            }
        }
        return result;
}
  • 正确的解法

滑动窗口

循环中使用while而不是if

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

螺旋矩阵

题目链接:leetcode.cn/problems/sp…

关键词:定义范围 左闭右开

解题思路

class Solution {
    public int[][] generateMatrix(int n) {
        //关键是定义每个边的范围,左闭右开原则去遍历
        int[][] nums = new int[n][n];
        int startx=0; int starty=0; //每一圈的起始值
        int offset = 1; //定义左闭右开的最右边的值 该值随着圈数而增加 例如n=4,j取得最大值应该是到2=n-offset
        int loop = 1; //圈数
        int count = 1; //不断递增的正整数
        int i,j;
        //分奇偶两种情况,奇数要考虑最中间的一个值
        while(loop <= n/2){
            for(j = starty; j < n-offset; j++){
                nums[startx][j] = count++;
            }
            for(i = startx; i< n-offset; i++){
                nums[i][j] = count++;//此处的j=3
            }
            //⏰最开始递减的两个循环条件范围给错了 给的是0
            for(;j > startY; j--){
                nums[i][j] = count++; //此处i=3
            }
            for(;i > startX; i--){
                nums[i][j] = count++;//此处j=0
            }
            offset++;
            loop++;
            startx++;
            starty++;
        }
        if(n%2==1){
            nums[n/2][n/2] = count;
            //⏰标准答案:nums[startX][startY] = count;
        }
        return nums;
    }
}

拓展题目没做(区间和、开发商购买土地)