ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单调栈和单调队列

2022-07-09 22:01:48  阅读:102  来源: 互联网

标签:arr 队列 back pop int total 单调


单调栈利用栈实现单调化,求解问题的方式

单调栈可以求取最近的两边比自己大或者小的位置,再盛水和挡板类问题又应用,一般使用数组来替代stack容器

 1 int arr[N];
 2 int s[N];
 3 int total=0;
 4 int main(){
 5     ioscin;
 6     int n;
 7     cin>>n;
 8     int ans=0;
 9     for(int i=1;i<=n;++i){
10         cin>>arr[i];
11         while(total&&s[total]<arr[i]){
12             total--;
13             ans++;
14         }
15         if(total)
16         ans++;
17         s[++total]=arr[i];
18     }
19     cout<<ans<<endl;
20     return 0;
21 }
22 //单调栈,用于解决找两边比他大或者比他小的数。

单调队列,用来求取区间最值

 1 int arr[N];
 2 deque<int>da;
 3 deque<int>x;
 4 int main(){
 5     int n,k;
 6     cin>>n>>k;
 7     for(int i=0;i<n;++i){
 8         cin>>arr[i];
 9     }
10     for(int i=0;i<k;++i){
11         while(!x.empty()&&arr[x.back()]>arr[i]){
12             x.pop_back();
13         }
14         x.push_back(i);
15     }
16     cout<<arr[x.front()]<<' ';
17     for(int l=1;l+k<=n;++l){
18         while(!x.empty()&&arr[x.back()]>arr[l+k-1]){
19             x.pop_back();
20         }
21         x.push_back(l+k-1);
22         while(x.front()<l){
23             x.pop_front();
24         }
25         cout<<arr[x.front()]<<' ';
26     }
27     cout<<endl;
28     for(int i=0;i<k;++i){
29         while(!da.empty()&&arr[da.back()]<arr[i]){
30             da.pop_back();
31         }
32         da.push_back(i);
33     }
34     cout<<arr[da.front()]<<' ';
35     for(int l=1;l+k<=n;++l){
36         while(!da.empty()&&arr[da.back()]<arr[l+k-1]){
37             da.pop_back();
38         }
39         da.push_back(l+k-1);
40         while(da.front()<l){
41             da.pop_front();
42         }
43         cout<<arr[da.front()]<<' ';
44     }
45     return 0;
46 }
47 //单调队列,用以解决区间最大或最小值问题
48 //两者储存的都是下标,而不是值,比较时要注意

 

标签:arr,队列,back,pop,int,total,单调
来源: https://www.cnblogs.com/xuanru/p/16461964.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有