1. 程式人生 > 實用技巧 >Leetcode-209. 長度最小的子陣列

Leetcode-209. 長度最小的子陣列

給定一個含有 n 個正整數的陣列和一個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。
示例:

輸入:s = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子陣列 [4,3] 是該條件下的長度最小的子陣列。

#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <math.h>
#include <cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>


using namespace std;


/**
s = 7, nums = [2,3,1,2,4,3]
和為7,需要找到最短的連續子陣列之和大於等於7,此處的連續指的是 陣列下標的連續

思路:
    因為需要查詢連續的子陣列,所以silde window是最容易想到的方案
對於window法,此時我們可以設定2個指標,一前一後分別指代滑動視窗的其實位置和終止位置
- 開始的時候,start固定不動,end向後走,直到end走完或者視窗和大於s,此時我們可以得到一個候選的視窗
- 接著stat往前走,不斷改變這個視窗,去尋找最小的視窗大小
**/




class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int start_idx = 0;
        int end_idx = 0;
        int nums_size = nums.size();
        int sum = 0;
        int window_size = INT_MAX;
        while(start_idx<nums_size && end_idx<nums_size){
            while(sum<s && end_idx<nums_size)
                sum += nums[end_idx++];

            while(sum>=s && start_idx<end_idx){
                window_size = min(window_size, end_idx - start_idx);
                sum -= nums[start_idx++];
            }
        }

        return window_size==INT_MAX ? 0:window_size ;
    }
};





int main(int argc, char const *argv[]){

    Solution solu;

    vector<int> arr = {2,3,1,2,4,3};
    cout<<solu.minSubArrayLen(7,arr)<<endl;

    return 0;
}