DS & Algorithm | 滑动窗口(Sliding Window)
一、滑动窗口
滑动窗口算法通过特定窗口大小在遍历的同时进行特定操作,能将嵌套循环转变为一个单循环,因此减少时间复杂度。
通常适用于数组、字符串相关问题。
二、算法示例
固定窗口(通常用于求解子数组相关问题,如窗口最大值、中位数等)
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
double res = -10000, sum = 0;
for(int i = 0; i < nums.size(); i++) {
sum += nums[i];
if(i >= k) sum -= nums[i-k]; //移动窗口,将左侧元素移出
if(i >= k-1) res = max(sum / k , res);
}
return res;
}
};
可变窗口(通常用于求解数组或字符串中满足条件的最大长度问题)
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
/* 滑动窗口 */
int left = 0, right = 0, winCost = 0; //窗口指针、窗口开销
for(; right < s.size(); right++) {
winCost += abs(s[right] - t[right]);
if(winCost > maxCost) { //不满足条件则缩小窗口
winCost -= abs(s[left] - t[left]);
left++;
}
}
return right - left;
}
};

浙公网安备 33010602011771号