class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int start=0;
int end=0;
int ans=nums.size()+1;
int sum=0;
int n=nums.size()-1;
while(end<=n){
sum+=nums[end];
while(sum>=target){
ans=min(ans,end-start+1);
sum-=nums[start];
start++;
}
end++;
}
return (ans != nums.size() + 1) ? ans : 0;
}
};
解题思路:
-
定义两个指针
start
和end
,它们分别表示滑动窗口的左边界和右边界,初始值都为0。 -
定义变量
ans
来记录找到的最小长度的子数组,初始值设置为大于数组长度的任何值。 -
定义变量
sum
来记录滑动窗口内元素的和,初始值为0。 -
计算数组的长度
n
,以便在循环中使用。 -
进入循环,循环的条件是
end
不超过数组的末尾。 -
在每次迭代中,将
nums[end]
添加到sum
中,以扩展滑动窗口。 -
检查
sum
是否大于等于target
,如果是,则计算当前子数组的长度end - start + 1
,并与ans
比较,将较小的值更新到ans
中。 -
缩小滑动窗口,通过将
nums[start]
从sum
中减去,并递增start
,表示将窗口的左边界向右移动一个位置。 -
继续迭代,直到
end
到达数组的末尾。 -
最后,检查
ans
是否仍然等于初始值,如果是,说明没有找到满足条件的子数组,返回0;否则返回ans
。