leetcode 456. 132模式(单调递减栈还可以找到:对于每个值找到后面小于他的最大值)

6 篇文章 0 订阅

题目
在这里插入图片描述

  1. 时间复杂度nlogn:
    我们可以:对于每个i作为132模式中的3,i前面数字的最小值为x,看是否存在[i,n-1]中的数字在[x,nums[i]]之间。如何查看呢,可以先正序一遍求出每个i前面数字的最小值mi[i],然后倒序遍历,后面的放在一个set里,直接lower_bound,upper_bound。
  2. 单调栈还可以找到:对于每个值找到后面小于他的最大值)。
    所以假如i是132中的1,就需要看一下i后面的每个值x对应后面小于x的最大值y,一堆y里面的最大值second,假如nums[i]<second就说明存在132模式。

i后面不存在比nums[i]小的数,便不会入栈比较(废话)

class Solution {
#define INF 0x3f3f3f3f
public:
    bool find132pattern(vector<int>& nums) {
        int n=nums.size();
        if(n<3) return false;
        int second=-INF;
        stack<int>s;s.push(nums[n-1]);
        for(int i=n-2;i>=0;--i){//i作为1 second作为2 i比second小了,i一定比3小
            if(nums[i]<second) return true;//找到i后面小于nums[i]的最大值,看是否可以更新second
            while(!s.empty()&&s.top()<nums[i]) second=max(second,s.top()),s.pop();
            s.push(nums[i]);
        }
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值