力扣:962. 最大宽度坡

962. 最大宽度坡

这个题也是采用单调栈来做,但这道题要找每一个数右边离它最远且比它大的,也是每个数左边离他最远比他小的。

之前我们采用单调栈都是判断左边或右边离他最近的比他小的或大的,这个题不一样,但我们依然可以采用单调栈来做。

首先我们从数组左端建立一个单调递减的单调栈,每个元素与栈顶相比较,如果小就把下标加入进去。这里不用栈顶--,不用弹出,之前我们动态更新栈,这里我们只想建立递减一个栈而已。

显然数组里最小的元素的下标一定在栈里,假设其下标为i,则他所对应的最大宽度肯定是最右端下表-i,然后栈顶--,再让最右端与栈顶比较,由于栈中两元素之间的元素一定大于他俩,如果最右端比两元素都大,则在两元素所夹区间内,最右端元素的最大宽度是左端点,所以只需枚举右边与栈顶比较,小了右边就更新,直到栈为空。

class Solution {
public:
    int maxWidthRamp(vector<int>& nums) {
     int m=0;
     int stk[50005];int tt=1;
     stk[1]=0;
     for(int i=1;i<nums.size();i++)
     {
       if(nums[i]<nums[stk[tt]])
          stk[++tt]=i;
     }
     for(int i=nums.size()-1;i>=0&&tt;i--)
     {
        while(tt && nums[i]>=nums[stk[tt]])
        {
            m=max(m,i-stk[tt]);
            tt--;
        }
     }
     return m;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值