題目:
解答:
滑動窗口,左右指針指向窗口兩端,窗口為[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)