leetcode-209-長度最小的子數組
阿新 • • 發佈:2018-09-12
etc class cor 邊界 我們 miss 一個 ons code
題目描述:
給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組。如果不存在符合條件的連續子數組,返回 0。
示例:
輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數組 [4,3]
是該條件下的長度最小的連續子數組。
進階:
如果你已經完成了O(n) 時間復雜度的解法, 請嘗試 O(n log n) 時間復雜度的解法。
要完成的函數:
int minSubArrayLen(int s, vector<int>& nums)
說明:
1、這道題給定一個正整數s,和一個包含正整數的vector,要求在vector中找到最短長度的連續子數組,這個子數組中所有數的和>=s,返回子數組的長度。
2、這道題不會很難,我們用滑窗的方法找到和>=s的子數組,接著不斷更新最短的長度,最終返回這個最短的長度即可。
最後要考慮一下邊界情況,也就是當滑窗到達vector末尾了怎麽處理,和vector中沒有元素的情況。
代碼如下:(附詳解)
int minSubArrayLen(int s, vector<int>& nums) { if(nums.empty())return 0;//vector中沒有元素,找不到滿足條件的子數組,返回0 int start=0,end=0,s1=nums.size(),sum=nums[0],record=INT_MAX;//start表示滑窗的開端,end表示滑窗末端 while(start<s1)//對開端在vector中的每個位置,都進行考慮 { while(sum<s)//當和小於s時,末端不斷向右走,sum也不斷地加 { end++; if(end==s1)//如果超出vector的長度,那麽當前滑窗不滿足條件的,這個時候也就可以返回record了 return record==INT_MAX?0:record;//如果record等於初始值,那麽必然沒有改變過record,也就是從頭到尾都沒找到滿足條件的滑窗 sum+=nums[end]; } record=min(record,end-start+1);//更新record sum-=nums[start];//減去開端 start++;//開端到了下一位 } return record; }
上述代碼實測8ms,beats 98.44% of cpp submissions。
leetcode-209-長度最小的子數組