题解:AcWing 830 单调栈
【题目来源】
AcWing:830. 单调栈 - AcWing题库
【题目描述】
给定一个长度为 \(N\) 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 -1。
【输入】
第一行包含整数 \(N\),表示数列长度。
第二行包含 N 个整数,表示整数数列。
【输出】
共一行,包含 \(N\) 个整数,其中第 \(i\) 个数表示第 \(i\) 个数的左边第一个比它小的数,如果不存在则输出 \(-1\)。
【输入样例】
5
3 4 2 7 5
【输出样例】
-1 3 -1 2 2
【解题思路】

【算法标签】
《AcWing 830 单调栈》 #单调栈#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100010; // 定义数组最大长度
int n; // 输入数字的个数
int stk[N], tt; // stk: 模拟栈的数组, tt: 栈顶指针
int main()
{
cin >> n; // 输入数字个数
for (int i = 0; i < n; i++)
{
int x;
cin >> x; // 输入当前数字
// 维护单调递增栈:弹出所有大于等于当前元素的栈顶元素
while (tt && stk[tt] >= x)
tt--;
// 如果栈不为空,输出栈顶元素(即左边第一个比x小的数)
if (tt)
cout << stk[tt] << " ";
else
cout << -1 << " "; // 栈为空输出-1
// 将当前元素压入栈
stk[++tt] = x;
}
return 0;
}
// 通过洛谷题目,修正模板
#include <bits/stdc++.h>
using namespace std;
const int N = 100005; // 定义数组最大长度
int n; // 元素个数
int a[N]; // 存储输入数组
int ans[N]; // 存储结果数组
int stk[N]; // 单调栈(存储下标)
int tt; // 栈顶指针
int main()
{
cin >> n; // 输入元素个数
// 输入数组元素
for (int i = 1; i <= n; i++)
cin >> a[i];
// 使用单调栈处理每个元素
for (int i = 1; i <= n; i++)
{
// 维护单调递增栈:弹出所有大于等于当前元素的栈顶元素
while (tt && a[stk[tt]] >= a[i])
tt--;
// 如果栈不为空,当前元素左边第一个比它小的元素就是栈顶元素
if (tt)
ans[i] = a[stk[tt]];
else
ans[i] = -1; // 栈为空表示左边没有更小的元素
// 将当前元素的下标压入栈
stk[++tt] = i;
}
// 输出结果
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
return 0;
}
【运行结果】
5
3 4 2 7 5
-1 3 -1 2 2
浙公网安备 33010602011771号