提示:以下是本篇文章正文内容
一、题目
给定一个长度为 N
的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1
。
输入格式
第一行包含整数 N
,表示数列长度。
第二行包含 N
个整数,表示整数数列。
输出格式
共一行,包含 N
个整数,其中第 i
个数表示第 i
个数的左边第一个比它小的数,如果不存在则输出 −1
。
数据范围
1≤N≤105
1≤数列中元素≤109
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
二、思路及代码
1.思路
考虑 用栈来保存。
可以注意到,如果向左边找第一个小的话,那么举例子
a3 > a5 (3 < 5 ) a3永远做不了答案因为 a5满足条件,那么a3没必要保存。所以栈的里面最后一定是趋势相同的 也就是单调上升。具体看代码。
2.答案
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int stk[N], idx;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++)
{
int x;
cin >> x;
while(idx && stk[idx] >= x) idx --;
if(idx) cout << stk[idx] << ' ';
else cout << "-1" << ' ';
stk[ ++ idx] = x;
}
return 0;
}
1624

被折叠的 条评论
为什么被折叠?



