算法理解
从右向左扫描,栈内存储可能成为答案的下标,并让对应值从栈顶到栈底递增。当前数会淘汰所有不比它大的候选;剩余栈顶就是右侧第一个更大元素。
- 复杂度:
O(n),每个下标只进栈、出栈一次。 - 注意:如果要求“更大或相等”,弹栈条件要从
<=改为<。
模板代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
stack<int>zhan;
int n;
cin>>n;
vector<int>a(n+1);
vector<int>ans;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
// 输出之后第一个比i大的元素
for (int i=n;i>0;i--)
{
while (zhan.size()&&a[zhan.top()]<=a[i])
{
zhan.pop();
}
if (!zhan.size()) zhan.push(i), ans.push_back(0);
else
{
ans.push_back(zhan.top());
zhan.push(i);
}
}
for (int i=n-1;i>=0;i--)
{
cout<<ans[i]<<' ';
}
return 0;
}
