【3月30日每日一题】 滑动窗口 Editional

滑动窗口

https://ac.nowcoder.com/acm/problem/50528

STL

单调队列具体来说,就是保证成员满足单调递增递减的队列。在新成员进入时,需要将他的权与队尾成员的权相比较,若将这个成员直接插入时不满足条件了,则将队尾出队,反复循环直至满足要求或队列为空为止。这时再插入便可以保证队列的单调性了。题目要求同时寻找最大值和最小值,则只需开两个单调队列即可。我们要的答案便是每次操作后队首元素的集合。

但要注意窗口可滑动。当窗口左端坐标超过队首时,这个队首不在窗口中。解决方法是在入队时记录该元素的坐标。在每次入队操作后开始从对首连续删除坐标不满足要求的元素,此时的对首才是我们要求的答案。

再注意要用的容器类型。因为要同时对队首和队尾进行操作,本题选择deque。

Code:

#include<bits/stdc++.h>
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define Forward(i,a,b) for(i=(a);i>=(b);--i)
using namespace std;
struct node
{
    int nu,ind;//分别是权值和坐标
}s;
deque<node>G;//记录最大值用的队列
deque<node>F;//记录最小值用的队列
int n,k,ma[2000000],mi[2000000];
void input(int w,int in)
{
    s.nu=w;
    s.ind=in;
    while(!G.empty() && s.nu>G.back().nu)G.pop_back();//删除不满足要求的队尾
    G.push_back(s);//压入    下面的操作同理
}
void init(int w,int in)
{
    s.nu=w;
    s.ind=in;
    while(!F.empty() && s.nu<F.back().nu)F.pop_back();//同上
    F.push_back(s);
}
void output(int in)
{
    while(G.front().ind<in)G.pop_front();//将窗体以左的队首出队
    while(F.front().ind<in)F.pop_front();//同上
}
int main()
{
    cin>>n>>k;
    int i,w;
    For(i,1,k)//先进入第一个窗体
    {
        cin>>w;
        input(w,i);
        init(w,i);
    }
    ma[1]=G.front().nu;
    mi[1]=F.front().nu;
    For(i,k+1,n)//滑动处理
    {
        cin>>w;
        input(w,i);
        init(w,i);
        output(i-k+1);
        ma[i-k+1]=G.front().nu;
        mi[i-k+1]=F.front().nu;
    }
    For(i,1,n-k+1)printf("%d ",mi[i]);putchar('\n');//输出
    For(i,1,n-k+1)printf("%d ",ma[i]);putchar('\n');
    return 0;
}
全部评论

相关推荐

2025-12-24 15:25
已编辑
门头沟学院 前端工程师
是腾讯的csig腾讯云,前天晚上九点突然打电话约面,激动的通宵学了一晚上,第二天状态很差改了今天(以后再也不通宵学习了)感觉自己浪费了面试官一个半小时单纯手写+场景,无八股无项目无算法,打击真的很大,全是在面试官提醒的情况下完成的,自己技术方面真的还是有待提高,实力匹配不上大厂和已经面试的两个公司完全不一样,很注重编码能力和解决问题的能力,然而我这两个方面都很薄弱,面试官人很好很耐心的等我写完题目,遇到瓶颈也会提醒我,写不出题也会很耐心的跟我讲解好感动,到最后面试结束还安慰我打算把下周最后一场面试面完之后就不面啦,如果能去实习还是很开心,但是最重要的还是好好努力提高技术以下是面经第一题//&nbsp;实现一个解析&nbsp;url&nbsp;参数的函数function&nbsp;parseUrl(urlStr)&nbsp;{//&nbsp;TODO}parseUrl('*********************************************');//&nbsp;返回&nbsp;{a:&nbsp;1,&nbsp;b:&nbsp;2,&nbsp;c:&nbsp;3}追问:在链接里见过什么部分?用&nbsp;hash&nbsp;路由的话放在哪第二题//&nbsp;考虑有一个异步任务要执行,返回&nbsp;Promise,这个任务可能会失败,请实现&nbsp;retry&nbsp;方法,返回新方法,可以在失败后自动重试指定的次数。/***&nbsp;异步任务重试*&nbsp;@param&nbsp;task&nbsp;要执行的异步任务*&nbsp;@param&nbsp;times&nbsp;需要重试的次数,默认为&nbsp;3&nbsp;次*/function&nbsp;retry(task,&nbsp;times&nbsp;=&nbsp;3)&nbsp;{//&nbsp;TODO:&nbsp;请实现}//&nbsp;---------------测试示例&nbsp;----------------//&nbsp;原方法const&nbsp;request&nbsp;=&nbsp;async&nbsp;(data)&nbsp;=&gt;&nbsp;{//&nbsp;模拟失败if&nbsp;(Math.random()&nbsp;&lt;&nbsp;0.7)&nbsp;{throw&nbsp;new&nbsp;Error('request&nbsp;failed');}const&nbsp;res&nbsp;=&nbsp;await&nbsp;fetch(&#39;https://jsonplaceholder.typicode.com/posts&#39;,&nbsp;{method:&nbsp;'POST',body:&nbsp;JSON.stringify(data),});return&nbsp;res.json();}//&nbsp;新的方法const&nbsp;requestWithRetry&nbsp;=&nbsp;retry(request);//&nbsp;使用async&nbsp;function&nbsp;run()&nbsp;{const&nbsp;res&nbsp;=&nbsp;await&nbsp;requestWithRetry({&nbsp;body:&nbsp;'content'&nbsp;});console.log(res);}run();第三题就是给&nbsp;retry&nbsp;函数添加类型注释,用到泛型第四题:在组件库中将&nbsp;Alert&nbsp;用&nbsp;api&nbsp;的形式实现(应该就是&nbsp;message&nbsp;这个组件)怎么渲染到一个浮层里而不是原地渲染出来
不知道怎么取名字_:技术这个东西,太杂了,而且要下功夫的
查看5道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务