本文已参与「新人创作礼」活动,一起开启掘金创作之路。
209. 长度最小的子数组
- 题号:力扣209
- 知识点:数组,滑动窗口
- 总结
题干:
滑动窗口解法思路:
- 1.先让窗口的右边界移动,如果子数组的和大于或等于了target,记录子数组长度,并同时移动窗口的左边界。
- 2.在左右边界移动的过程中,只要子数组的和大于等于了target,那么就会得到一个子数组的长度,过程中需要一直维护这个变量为当前最小值
- 3.窗口左侧边界的移动时,说明子数组之和已经大于或等于了target,为了测试减小一个左侧的数是否还成立,若成立就得到了更小的子数组长度。
// C++ 滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 滑动窗口的起点
int i = 0;
// 子数组的和
int sum = 0;
// 维护的子数组的长度
int res = nums.size() + 1;
// j为子数组的终点
for (int j = 0; j<nums.size(); j++){
sum += nums[j];
while(sum >= target){
// j-i+1为子数组的长度
res = res<(j-i+1) ? res : j-i+1;
sum -= nums[i];
// 核心:窗口左边界移动
i += 1;
}
}
return res>nums.size() ? 0 : res;
}
};