模板题单调栈

本文介绍了一种使用单调栈优化的问题解法,通过从右到左遍历数组,找到每个位置上的人看到的第一个比自己高的人的下标。时间复杂度由O(n^2)降低到O(n)。
摘要由CSDN通过智能技术生成

题目:

注意 :

使用正常遍历方法时间复杂度为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]);
	}
}

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值