文章目录
题目描述
- 给定一个长度为
N
的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出−1
。
输入格式
- 第一行包含整数
N
,表示数列长度。 - 第二行包含
N
个整数,表示整数数列。
输出格式
- 共一行,包含
N
个整数,其中第i
个数表示第i
个数的左边第一个比它小的数,如果不存在则输出−1
。
数据范围
1 ≤ N ≤ 10^5
1 ≤ 数列中元素 ≤ 109
基本思路
- 本题是单调栈最经典的应用情况。单调栈是指一个其中的元素是按照顺序排列的栈。
- 基本思路为:
- 首先构建一个空的整数类型的栈;
- 每次读取一个数组元素,进行判定:
- 如果此时的栈为空,则直接输出
-1
,然后将该元素入栈; - 如果此时的栈不为空,则将当前数组元素与栈顶元素比较。如果当前元素小于等于栈顶元素,则将栈顶元素出栈,然后比较当前元素和更新后的栈顶元素。重复上述过程,如果最终找到了一个比当前数组元素小的栈顶元素,则输出该栈顶元素的值;如果没有找到比当前数组小的栈顶元素(即把栈中的所有元素都出栈了,仍然没有找到),则直接输出
-1
。最后,将当前的数组元素入栈。
- 如果此时的栈为空,则直接输出
- 重复上述过程直到所有数组元素均输入完成。
实现代码
cpp
#include <cstdio>
#include <stack>
using namespace std;
int main(void)
{
int N;
scanf("%d", &N);
stack<int> sorted_stack;
for(int i = 0; i < N; ++ i)
{
int x;
scanf("%d", &x);
if(sorted_stack.empty()) printf("-1 ");
else
{
while(!sorted_stack.empty() && sorted_stack.top() >= x) sorted_stack.pop();
if(sorted_stack.empty()) printf("-1 ");
else printf("%d ", sorted_stack.top());
}
sorted_stack.push(x);
}
return 0;
}