单调栈

  • 单调递增栈:数据出栈的序列为单调递增序列
  • 单调递减栈:数据出栈的序列为单调递减序列

1.视野总和

描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。
输入:4 3 7 1
输出:2
解释:个子为4的可以看到个子为3的发型,个子为7可以看到个子为1的身高,所以1+1=2

思路:观察后发现,实际上题目可以转化为——计算当前数字和它右边第一个大于他的数字之间有多少个数字,然后遍历每个数字将结果累加就是答案,但是这里时间复杂度为O(N^2)。

           所以我们将问题转化为——求每个人被看到的次数(即这个人向左单调递增的区间长度)。

           考虑使用单调栈解决——从左到右依次读取当前人的高度,从栈顶开始把高度小于或等于当前人的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前人的其他人的数量。

#include <iostream>
#include <stack>
using namespace std;
int sumOfBeingSeen(int* arr,int n){
    stack<int> s;
    int sum=0;
    for(int i=0;i<n;i++){
        while(!s.empty()){
            if(s.top()<=arr[i])
                s.pop();
            else{
                sum+=s.size();
                break;
            }
        }
        s.push(arr[i]);
    }
    return sum;
}

int main(){
    int n;
    cin>>n;
    int *arr=new int[n];
    for(int i=0;i<n;i++)
        cin>>arr[i];

    cout<<sumOfBeingSeen(arr,n);

    return 0;
}

2.L

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值