题目简介:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
1 2 3
| 输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。
|
思路:
设置双指针,起始均指向首元素,定义一个sum
,表示子数组的累积和。
然后右指针开始向右移动,sum
一直累加nums[right]
,直至sum >= s
,此时左指针开始向右移动,sum
依次减去nums[left]
,并每次保存sum >= s
时的子数组长度,直至sum < s
,此次遍历结束,开始下一次遍历。
tips:
- 子数组长度为
right - left + 1
- 需要注意
Min_len == 0
时的特殊情况判断
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: int minSubArrayLen(int s, vector<int>& nums) {
int left = 0; int right = 0; int Min_len = 0;
int sum = 0;
while(right < nums.size()){
sum += nums[right];
while(sum >= s){ if(Min_len == 0) Min_len = right - left + 1; else Min_len = min(Min_len, right - left + 1); sum -= nums[left]; left++; }
right++; }
return Min_len;
} };
|