题目:
解答:
滑动窗口,左右指针指向窗口两端,窗口为[left,right],left=right时窗口只包含一个元素。
窗口内元素和sum>=target时,left++,推出左侧一个元素;sum<target时,right++,加入右侧一个元素。也即相当于用for遍历右指针位置,右指针最后到len-1位置并且sum<target时候结束。
ans为窗口内元素个数,ans的初始化需要满足ans>n,以方便判断是否全部元素加起来都不满足target。[left,right]窗口内元素个数计算为:right-left+1。遍历,满足sum>target时候更新ans即可.
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int len = nums.size();int ans = len+1;int left = 0;int right = 0;int sum = 0;for(right;right<len;right++){sum+=nums[right];while(sum>=target){ans=min(ans,right-left+1);sum-=nums[left];left++;}}if(ans>len) return 0;else return ans;}
};
时间复杂度O(n)
空间复杂度O(1)