【栈】单调栈

一.定义

 单调栈是一种特殊的栈,它的特点是栈中的元素保持单调性。具体来说,可以分为单调递增栈单调递减栈两种类型。

单调递增栈是指栈中的元素从栈底到栈顶逐渐递增。当一个元素要入栈时,如果它比栈顶元素小,就将栈顶元素弹出,直到栈顶元素比它小为止。这样可以保证栈中的元素始终保持单调递增的状态。

单调递减栈则是栈中的元素从栈底到栈顶逐渐递减。当一个元素要入栈时,如果它比栈顶元素大,就将栈顶元素弹出,直到栈顶元素比它大为止。这样可以保证栈中的元素始终保持单调递减的状态。

单调栈常用于解决一些与区间相关的问题,例如找到每个元素左侧/右侧第一个比它大/小的元素等。这类问题可以通过维护一个单调栈来解决,具体实现方式与单调栈的类型有关。

单调栈是一种非常高效的数据结构,时间复杂度通常为 O(n)。它在算法竞赛和工程开发中都有广泛的应用。

二.经典例题一

        一.题目

 大家排队,都面向右边。大家只能向右看。从左边数第一位开始,如果第2位同学比他低,他能看到该同学的头型,如果高就看不到了,后面的也看不到。输入n个人,再输入n个人的身高。求所有人能看到其他人的头型总数有多少。(1<n<10^6)
输入:
共两行。第一行一个整数n表示总人数。
第二行依次输入n个人的身高。
输出:
一个整数,表示所有人能看到其他人的头型总数
输入示例:
6 10 3 7 4 12 2
输出示例:
5

         二.图解示意

        三.暴力解法(O(n^{2}))

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	int sum=0;
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(a[i]>a[j]) sum++;
			else break;
		}
	}
	cout<<sum<<endl;
	return 0;
}

        四.单调栈解法(O(n))

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n,ans=0;
	stack<long long> s;
	cin>>n;
	while(n--){
		long long p;
		cin>>p;
		while(!s.empty()&&s.top()<=p){
			s.pop();
		}
		ans+=s.size();
		s.push(p);
	}
	cout<<ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值