题目:
注意 :
使用正常遍历方法时间复杂度为o(n^2),使用单调栈时间复杂度为o(n);
思路:
单调栈问题类似一排人站队,问每个人向右看看到的第一个比他高的人
将数组从右至左遍历,当栈内元素为空时,遍历的第一个元素一定进栈,当当前元素大于栈内元素时,后面的人也不在看到此时的栈内元素,因此将栈内元素弹出,并使当前元素入栈
满分代码:
数组a保存输入的数据,q保存下标,f保存答案
#include <iostream>
using namespace std;
int a[3000005],r,q[3000005],f[3000005];
int main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = n; i >= 1 ; i--) {
while (a[i] > a[q[r]] && r > 0) {
r--;
}
f[i] = q[r];
q[++r] = i;
}
for (int i = 1; i <= n; i++) {
printf("%d ", f[i]);
}
}