首先这道题,左边右边都是一样的,只要换一个方向遍历就可以了
-
这里我们考虑左边
-
单调栈找当前数左边第一个比它小的数
考虑一个栈来存储当前遍历到的数 - 有这个性质,如果栈内元素a[x] >= a[y] , 并且x < y , 那么a[x]永远不会被访问到,因为右边有一个比它小的数,所以我们可以直接删除它;
- 对应到栈的维护上,就是每次判断栈顶元素是否 >= 当前的元素,如果是,那么pop,否,入栈
stack<int> s;
int n;
cin >> n;
while(n--)
{
int x;
cin >> x;
while(!s.empty() && s.top() >= x) s.pop();
if(!s.empty()) cout << s.top() << " ";
else cout << -1 << " ";
s.push(x);
}
- 找左边第一个大于当前数的数
while(n--)
{
int x;
cin >> x;
while(!s.empty() && s.top() <= x) s.pop();
if(!s.empty()) cout << s.top() <<" ";
else cout << -1 << " ";
s.push(x);
}