写点什么

滑动窗口

作者:秋名山码民
  • 2022 年 5 月 21 日
  • 本文字数:922 字

    阅读完需:约 3 分钟

无重复字符的最长子串

这道题主要就是滑动窗口的思想,何为滑动窗口?


其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!也是单调队列的经典应用


把最左边的队列持续移出,保留其最大长度,维持这个最大长度的队列,即是题目解


class Solution {public:    int lengthOfLongestSubstring(string s) {        if(s.size() == 0) return 0;//根据题目实例来特判一个        unordered_set<char> lookup;//在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序        int maxStr = 0;        int left = 0;        for(int i = 0; i < s.size(); i++){            while (lookup.find(s[i]) != lookup.end()){                lookup.erase(s[left]);                left ++;            }            maxStr = max(maxStr,i-left+1);            lookup.insert(s[i]);    }        return maxStr;            }};
复制代码

滑动窗口

#include<iostream>using namespace std;int h,t=-1;const int N=1e6+10;int a[N],q[N];int main(){    int n,k;    cin>>n>>k;    for(int i=0;i<n;i++) cin>>a[i];        for(int i=0;i<n;i++)    {        if(h<=t && i-q[h]+1>k) h++;        while(h<=t && a[q[t]]>=a[i]) t--;        q[++t]=i;        if(i+1>=k) cout<<a[q[h]]<<' ';    }    cout<<endl;    h=0;t=-1;     for(int i=0;i<n;i++)    {        if(h<=t && i-q[h]+1>k) h++;        while(h<=t && a[q[t]]<=a[i]) t--;        q[++t]=i;        if(i+1>=k) cout<<a[q[h]]<<' ';    }    return 0;}
复制代码

滑动窗口的平均值

class MovingAverage {private:    int len = 0;    queue<int> nums;    double sum = 0;public:    MovingAverage(int size) {        len = size;    }        double next(int val) {        nums.push(val);        sum += val;        if (nums.size() > len) {            sum -= nums.front();            nums.pop();        }        return sum / nums.size();    }};
复制代码


发布于: 3 小时前阅读数: 5
用户头像

卷不死,就往…… 2021.10.19 加入

2019NOIP退役成员,华为云享专家,阿里云专家博主,csdn博主,努力进行算法分享,有问题欢迎私聊

评论

发布
暂无评论
滑动窗口_算法_秋名山码民_InfoQ写作社区