一、解题思路
滑动窗口使用思路(寻找最长)
——核心:左右双指针(left,right)在起始点,right向右逐位滑动循环
——每次滑动过程中
如果:窗口内满足条件,right向右扩大窗口,并更新最优结果
如果:窗口元素不满足条件,left向右缩小窗口
——right到达结尾
滑动窗口使用思路(寻找最短)
——核心:左右双指针(left,right)在起始点,right向右逐位滑动循环
——每次滑动过程中
如果:窗口元素满足条件,left向右缩小窗口,并更新最优结果
如果:窗口元素不满足条件,right向右扩大窗口
——right到达结尾
二、算法模板
// 最长模板
//最长模板
初始化left,right,result,bestresult
while(右指针没有到结尾)
窗口扩大,加入right对应元素,更新当前result
while(result不满足要求){
窗口缩小,日出left对应元素,left右移
}
更新最优结果beftresult
right++;
}
范围bestresult
//最短模板
初始化left,right,result,bestresult
while(右指针没有到结尾)
窗口扩大,加入right对应元素,更新当前result
while(result满足要求){
更新最优结果beftresult
窗口缩小,日出left对应元素,left右移
}
right++;
}
范围bestresult
三、例题
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int curSum = 0;
int result = INT_MAX;
while (right < nums.size()) {
curSum += nums[right];
while (curSum >= target) {
result = min(result, right - left + 1);
curSum -= nums[left];
left += 1;
}
right += 1;
}
return result == INT_MAX ? 0 : result;
}
};
参考:精心总结滑动窗口代码模板, 直接搞定80道Leetcode算法题_哔哩哔哩_bilibili