题目描述
给定一个含有n
个正整数的数组和一个正整数s
,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
样例
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
算法
尺取法(双指针) $O(N)$
根据题意,要求我们找到一个满足条件的最短区间,可以用尺取法(一般用来求满足某个条件的最小区间,就是最短的尺子)也就是双指针来做:
- 1.初始化左右端点
- 2.不断扩大右端点,直至满足条件
- 3.如果直至终点也无法满足条件,则终止,否则更新结果
- 4.扩大左端点(右移1),跳回步骤2
时间复杂度
每个点最多遍历两次,故时间复杂度是O(N)的。
空间复杂度是常数O(1)的。
C++ 代码
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int ans = INT_MAX;
int n = nums.size();
int l = 0, r = 0, sum = 0;
while(true){
while(r<n && sum <s) sum += nums[r++]; //不断扩大右端点,直至满足条件
if(sum < s) break; //直到终点也无法满足条件,终止
ans = min(ans,r-l); //更新答案
sum -= nums[l++]; //扩大左端点,找到更小的答案
}
if(ans == INT_MAX) return 0;
return ans;
}
};