单调栈存放下标,详情见注释
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<string>
using namespace std;
int arr[3000010] = { 0 };
int ans[3000010] = { 0 };
int main()
{
stack<int>v;
int n,p;
cin >> n;
p = n-1;//从末尾开始
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
arr[n] = 9999999999;
v.push(n);//放入最大数栈底
for (int i = n-1; i >= 0; i--)
{
while (1)
{
if (arr[i] < arr[v.top()])//如果小于栈顶下标元素
{
ans[p] = v.top();//存答案
p--;
v.push(i);//存当前下标
break;
}
else//否则弹出栈顶,继续比较下一栈顶,直到预存的最大
{
v.pop();
}
}
}
for (int i = 0; i < n; i++)//输出答案
{
if (ans[i] == n)
{
cout << 0 << " ";
}
else
{
cout << ans[i]+1 << " ";
}
}

京公网安备 11010502036488号