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;
}