力扣209:長度最小的子數組
- 題目
- 思路
- 代碼
題目
給定一個含有 n 個正整數的數組和一個正整數 target 。
找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其長度。如果不存在符合條件的子數組,返回 0 。
思路
這道題我們先把條件改一下,我們先找符合條件的子數組不需要要長度最小的,那么我們只需要一個for循環再加一個if判斷就可以了,思路就是我們從數組頭開始一個一個的加直到總值大于target即可。現在我們再想怎么得到長度最小的子數組,要知道我們的條件是總和大于等于target的子數組所以在我們加上最后一個數滿足條件時我們當時子數組的尾就已經定死了,我們只能移動頭也就是我們可以減去子數組第一個位置來判斷是否還滿足條件。每次移動頭之前我們都判斷一下現在子數組的長度是否是最小的。所以整體的思路就是我們先移動子數組的尾等尾定死了我們就再移動頭直到沒法滿足條件我們再開始移動尾,然后滿足條件后再繼續移動頭。這樣來回的移動頭尾的位置從而得到長度最小的子數組。
所以我們發現我們的子數組是在不斷的移動的也可以說是在滑動的,這也就是滑動窗口的思路。
代碼
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int res = INT_MAX;int n = nums.size();if(n == 0){return 0;}//子數組的范圍int end = 0;int start = 0;int total = 0;while(end < n){//移動子數組的尾直到滿足條件total += nums[end];//移動子數組的頭直到不滿足條件while(total >= target){//等到total大于target//我們就可以移動子數組的頭從而得到最小長度res = min(res,end-start+1);total -= nums[start];start++;}end++;}return res == INT_MAX ? 0 : res;}
};