【长度最小的子数组】
思路分析
-
滑动窗口(双指针):
l
是窗口的左边界,r
是窗口的右边界。sum
是当前窗口[l, r]
的和。- 如果
sum < target
,则右移r
以扩大窗口,增加sum
。 - 如果
sum >= target
,则计算当前窗口长度r-l+1
,并尝试左移l
以缩小窗口,减少sum
,寻找更小的满足条件的子数组。
-
边界条件:
- 当
r
到达数组末尾时,不能再右移r
,只能尝试左移l
。 - 如果整个数组的和都
< target
,则返回0
。
- 当
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int l=0,r=0;int n=nums.size();
int sum=nums[0];
int len=INT_MAX;while(l<n&&r<n){ if(sum<target){r++;if(r<n)sum+=nums[r];}else if(sum>=target){len=min(len,r-l+1);sum-=nums[l]; l++;}}return len==INT_MAX?0:len;}
};