209.长度最小的子数组
原题
双指针
用start和end两个指针指向子数组的开始和结束位置,当子数组的和小于目标和s时右移右指针end,直至子数组和大于等于s,此时,更新最短子数组长度,右移左指针,缩短数组长度,直至end走到数组末尾为止。
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int start=0, end=0, ans=INT_MAX;//初始化,开始位置和结束位置都是0,数组长度为INT_MAX
int sum=0;//记录当前子数组的和
int n=nums.size();
if(n==0) return 0;
while(end<n) {
sum+=nums[end];
while(sum>=s) {//当前子数组的和大于s时
//左指针向右移动,直至子数组和小于s
ans=min(ans,end-start+1);
sum-=nums[start];
start++;
}
end++;
}
return ans==INT_MAX?0:ans;
}
};
时间复杂度O(n),空间复杂度O(1)。