leetcode刷题day2|数组部分( 209.长度最小的子数组、 59.螺旋矩阵II)

209.长度最小的子数组

思路:之前刷过一些题,所以先入为主的想用栈来实现滑动窗口,但具体怎么实现没搞清楚,就想了很久,这个还是使用双指针即可实现滑动窗口。
第一次写完代码报错了,没找到原因,对应代码随想录上的答案发现,在设计左窗口时,没有使用循环,就判断了一次,导致结果出错,修改后代码如下:

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

优化后的代码:

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

59.螺旋矩阵II

思路:一年前好像思考过这个题,但当时想了很久也没想出来,现在遇到题目不会再自己想破头了,直接看正确答案和思路会更清晰。
1、两层循环:
第一层循环是转的圈数n/2,如果n为奇数,需要单独给最中间的位置,也就是最后一圈的起点赋值。
第二层循环是四个边,遵循左闭右开的原则,每一个边是n-1个元素。
2、设置每一圈的起点[startX][startY],以及每一条边的终止变量offset;每完成一圈更新。

代码如下:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums=new int[n][n];
        int loop=1;//记录圈数
        int startX=0,startY=0;
        int offset=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++;
            }
            for(;j>startY;j--){
                nums[i][j]=count++;
            }
            for(;i>startX;i--){
                nums[i][j]=count++;
            }
            offset++;
            startX++;
            startY++;
            loop++;
        }
        if(n%2!=0){
            nums[startX][startY]=count;
        }
        return nums;
    }
}

这个需要写的熟练,晚点会再练习一遍。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值