传送门:长度最小的子数组
Problem/题意
给定一个整数数组和一个整数 target
,要求算出数组中最小长度的连续子数组,数组元素的和大于等于 target
。
Thought/思路
题目要求维护最小的长度,因此我们希望:当条件不满足时,不断扩大子数组长度;当条件满足(sum >= target
)时,就可以尝试缩短子数组长度,并进行一次答案的维护。这显然是一个双指针的解法。
Code/代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int ans = 1e9, now = 0;
for (int l = 0, r = -1; l < nums.size(); ++ l) {
while (now < target && r + 1 < nums.size()) {
now += nums[++ r]; // 扩大子数组长度
}
if (now >= target) {
ans = std::min(ans, r - l + 1);
}
now -= nums[l]; // 缩短子数组长度
}
return ans == 1e9 ? 0 : ans;
}
};