单调栈 用途:主要找到每个数左边离他最近的且比它小的数在什么地方(或者找到每个数右边离他最近的且比它大的数在什么地方)
题目 给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 ?1。方法一:暴力解法
输入格式 第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式 【数据结构与算法(c++)|【19. 单调栈】】共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 ?1。
数据范围 1≤ N ≤ 105
1≤ 数列中元素 ≤ 109
输入样例:5 3 4 2 7 5
输出样例:-1 3 -1 2 2
for (int i = 0;
i < n;
i ++)
for (int j = i - 1;
j >= 0;
j --)
if (a[i] > a[j])
{
cout << a[j] << endl;
break;
}
#include
using namespace std;
const int N = 100010;
int q[N];
int n;
int main()
{
cin >> n;
for (int i = 0;
i < n;
i ++)cin >> q[i];
for (int i = 0;
i < n;
i ++)
{
int j = i - 1;
for (;
j >= 0;
j --)
{
if (q[j] < q[i])
{
cout << q[j]<<" ";
break;
}}
if (j < 0)
{
cout << "-1" <<" ";
}
}
return 0;
}
方法二:优化
- 用栈存储 i 左边的元素
- 如果 ax >= ay,并且x < y那么ax永远不会输出,就直接可以删除。(只要有这种逆序的关系,前面的数就会被删掉,此时剩下的序列就是单调序列了)
#include
using namespace std;
const int N = 100010;
int n;
int stk[N], tt;
int main()
{
cin >> n;
for (int i = 0;
i < n;
i ++)
{
int x;
cin >> x;
while (tt && stk[tt] >= x) tt -- ;
if (tt) cout << stk[tt] << " ";
else cout << "-1" << " ";
stk[ ++ tt] = x;
//cout << tt << endl;
;
}
return 0;
}
推荐阅读
- C|【c ++ primer 笔记】第4章 表达式
- C|【c ++ primer 笔记】第3章 字符串、向量和数组
- 数据结构与算法(c++)|【18. 模拟栈和队列】
- mediapipe|Mediapipe 人体姿态估计专题(一) Blaze组件算法之Blazeface (带一个小开源分享给大家)
- cpp|cpp 模板函数,类模板(1)
- 初学至学会C++|初阶C++——C++第二节——类和对象(大全篇)
- 初学至学会C++|初阶后的C++——第六节——IO流 与 继承
- 面试|上周,XX保险面试,凉了!!!
- 面试|实用 - Java后端面试经历(经验分享)适用于2~3年