题目链接:209.长度最小的子数组
思路:滑动窗口的关键就是如何确定窗口的左右边界以及移动边界的条件。
- 窗口内的元素:数值总和大于等于target的长度最小的子数组。
- 移动窗口的起始位置:如果当前窗口的值大于等于s,窗口向后移动。
- 移动窗口的结束位置:for循环遍历的指针。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//滑动窗口
int result = INT32_MAX;
int sum = 0;//滑动窗口的数值之和
int i = 0;//滑动窗口的起始位置
int SubLength;//滑动窗口的长度
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
/* 重点思路 */
while(sum >= target){
SubLength = j - i + 1;//获取滑动窗口长度
//判断当前结果是否比已记录结果小。如果是,更新最小长度。
result = result < SubLength ? result : SubLength;
//不断变更i的值(子串起始位置),寻找下一个子数组。
sum -= nums[i++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
时间复杂度:O(n)。
空间复杂度:O(1)。