滑动窗口-209. 长度最小的子数组-leetcode
创始人
2025-05-30 07:11:15

209. 长度最小的子数组

目录

题目

题解

代码


题目

图片:

题解

target==7

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}
}

相关内容

热门资讯

12月17日800现金流ETF... 12月17日,800现金流ETF(563990)涨0.98%,成交额2091.36万元。当日份额减少...
12月17日航天航空ETF(1... 12月17日,航天航空ETF(159208)跌0.41%,成交额2576.73万元。当日份额减少60...
12月17日港股通汽车ETF富... 12月17日,港股通汽车ETF富国(159239)跌0.10%,成交额448.74万元。当日份额减少...
12月17日创业板ETF东财(... 12月17日,创业板ETF东财(159205)涨3.34%,成交额9726.73万元。当日份额减少1...
12月17日创业板新能源ETF... 12月17日,创业板新能源ETF鹏华(159261)涨2.92%,成交额2411.02万元。当日份额...