题目链接:209.长度最小的数组
思路
fastidx :区间的尾部
slowidx :区间的头部
sum :区间所有元素的和
fastidx从前往后遍历,每遍历一个元素,将该元素加至sum。如果 sum > target ,更新区间长度,循环前移slowidx,尝试寻找更小的区间。
注意
该方法只有 nums 全部为非负数时可用,因为只有此时,fastidx才能够准确指向最小区间的末尾。
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int fastidx,slowidx;
int sum = 0;
int curlen, minlen = INT_MAX;
fastidx = slowidx = 0;
for (;fastidx < nums.size(); ++fastidx) {
sum += nums[fastidx];
while (sum >= target) {
minlen = min(minlen, fastidx-slowidx+1);
sum -= nums[slowidx];
slowidx++;
}
}
return minlen == INT_MAX ? 0 : minlen;
}
};