要求
- 给定一个含有 n 个正整数的数组和一个正整数 s
- 找出该数组中满足其和 ≥ s 的长度最小的连续子数组
- 如果不存在符合条件的连续子数组,返回 0
示例
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的连续子数组
思路
- 暴力解法(n3)
- 滑动窗口(时间n,空间1)
- 双索引,nums[l...r] 为滑动窗口
- 小于s,j后移
- 大于等于s,i后移
- 每次移动后,若大于等于s,则更新最小长度res
- L9:处理右边界到头的情况
1 class Solution{ 2 public: 3 int minSubArrayLen(int s, vector<int>& nums){ 4 int l = 0, r = -1; 5 int sum = 0; 6 int res = nums.size() + 1; 7 8 while( l < nums.size()) { 9 if( r+1 < nums.size() && sum < s) 10 sum += nums[++r]; 11 else 12 sum -= nums[l++]; 13 if(sum >= s) 14 res = min(res,r-l+1); 15 } 16 if(res== nums.size()+1) 17 return 0; 18 return res; 19 } 20 };
延伸
- 双索引技术