滑动窗口-209. 长度最小的子数组-leetcode

209. 长度最小的子数组

目录

题目

题解

代码


题目

图片:

题解

target==7

扫描二维码关注公众号,回复: 16504616 查看本文章

left和right刚开始的时候在第一个位置,二者同时指向2,sum==2,length==1

然后,右指针开始移动,left指向2,right指向3,sum==2+3==5,length==2

右指针继续移动,指向1,sum==2+3+1==6,length==3

右指针继续移动,指向2,sum==2+3+1+2==8,length==4

此时符合条件sum>=target,改变minlen的值,minlen=min(minlen,length);

每一次遇到sum>=target的情况,left指针向右移动一位,开始一次新的查找。

这时,left指向3,right指向2sum==3+1+2==6,length==3

右指针继续向右移动一位,sum==3+1+2+4==10,length==4

这时,满足sum>=target,minlen==4

左指针向右移动一位,sum==1+2+4==7,length==3

此时满足sum>=target的条件,minlen==3

左指针向右移动一位,sum==2+4==6,length==2

右指针向右移动一位,sum==2+4+3==9,length==3

左指针向右移动一位,sum==4+3==7,length==2

满足条件,minlen==2

左指针继续向右移动一位,sum==3,不符合条件,左右指针到头了,查找结束,指针不再移动

返回所记录的最小长度minlen。

等等,以此类推……

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        if (nums.length==0){
            return 0;
        }
        /*如果数组的长度为0,数组中没有元素,那么就不可能找到符合条件的子数组,就返回0*/
        int sum = 0;
        int left = 0;
        int minlen = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            /*左右指针,用右指针作为for循环进行移动*/
            sum+=nums[right];
            while (sum>=target){//如果符合条件,就移动左指针
                minlen=Math.min(minlen,right-left+1);
                sum-=nums[left];//移动左指针之前要减去sum中原先左指针指向的数值
                left++;
            }
        }
        return minlen==Integer.MAX_VALUE?0:minlen;//如果数组中始终没有满足条件的子数组,就返回0
    }
}

猜你喜欢

转载自blog.csdn.net/qq_64744030/article/details/129640210