题目描述

原题

题目大意&链接

给定一个长度为 n 的整数数列,要求输出每个数左边第一个比它小的数,如果不存在则输出 -1。

输入输出样例:
输入:

5
3 4 2 7 5

输出:

-1 3 -1 2 2

详情:ac_830单调栈

解题思路

维护一个栈,栈中元素保持单调递增的顺序。遍历数列时,对于当前元素 x,不断弹出栈顶元素直到栈顶元素小于 x 或者栈为空。

完整代码

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

const int N = 100010;

int stk[N], tt;

int main()
{
int n;
cin >> n;
while (n--)
{
int x;
scanf("%d", &x);
//栈不为空且栈顶元素大于等于 x 时,弹出栈顶元素(使栈具有单调性)
while (tt && stk[tt] >= x) tt--;
//如果栈空
if (!tt) printf("-1 ");
else printf("%d ", stk[tt]);
// x 入栈
stk[++tt] = x;
}

return 0;
}

时间和空间复杂度

时间复杂度:O(n)
空间复杂度:O(n)