Loading

Leetcode-456-132模式(单调栈)

题目链接


题目描述

数组 nums ,共 n 个整数。
132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,
并满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。

如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。

思路

从后遍历数组,维护个单调栈 (s),O(n)..

  1. 单调栈从 栈顶->栈底 单调增。
  2. 作为 "2" 的元素要尽可能大,这样才更有可能遇到 "1".
  3. 用max2记录 "2" 的最大值,max2初始为无穷小。
  4. 当 nuns[i] > s.top(), 即 nums[i] 可能作为 "3", 把所有可能的 "2" 出栈,并更新 max2.
  5. 当 nums[i] < max2 时,即构成 "132" 模式的子序列。

C++代码

class Solution {
public:
    bool find132pattern(vector<int>& nums) {
        stack<int> s;
        int len = nums.size();
        int max2 = INT_MIN;
        s.push(nums[len-1]);

        for (int i = len-2; i >= 0; i--) {
            if (nums[i] < max2)
                return true;
            while(!s.empty() && nums[i] > s.top()) {
                max2 = max(max2, s.top());
                s.pop();
            }
            s.push(nums[i]);
        }
        return false;
    }
};
posted @ 2022-01-21 15:47  ARUI丶  阅读(32)  评论(0编辑  收藏  举报