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;
}
posted @ 2020-09-18 22:05  real-zhouyc  阅读(114)  评论(0编辑  收藏  举报