DS & Algorithm | 滑动窗口(Sliding Window)

一、滑动窗口

滑动窗口算法通过特定窗口大小在遍历的同时进行特定操作,能将嵌套循环转变为一个单循环,因此减少时间复杂度。

通常适用于数组、字符串相关问题。

二、算法示例

固定窗口(通常用于求解子数组相关问题,如窗口最大值、中位数等)

  1. LeetCode-643 “子数组最大平均数 I”(c++)
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;
    }
};

可变窗口(通常用于求解数组或字符串中满足条件的最大长度问题)

  1. LeetCode-1208 “尽可能使字符串相等”(c++)
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;
    }
};
posted @ 2021-02-05 21:32  Einsier  阅读(69)  评论(0)    收藏  举报