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 。

示例 1:

输入:nums = [1,2,3,4]

输出:false

解释:序列中不存在 132 模式的子序列。

示例 2:

输入:nums = [3,1,4,2]

输出:true

解释:序列中有 1 个 132 模式的子序列: [1, 4, 2] 。

示例 3:

输入:nums = [-1,3,2,0]

输出:true

解释:序列中有 3 个 132 模式的的子序列:[-1, 3, 2]、[-1, 3, 0] 和 [-1, 2, 0] 。

提示:

n == nums.length

1 <= n <= 2 * 105^55

-109^99 <= nums[i] <= 109^99

我们可以先预处理nums,将其中元素存放到一个有序集合multiset中,然后用变量preMin记录之前出现过的最小值(因为132模式中,最左边的数字越小越能满足该模式),之后就可以遍历nums,遍历到一个值时,先将其从multiset中删去,这保证了multiset中都是当前遍历的值右边的数字,然后找出multiset中第一个大于preMin的数字sufMax,然后看preMin、当前遍历的数、sufMax是否是132模式:

cpp 复制代码
class Solution {
public:
    bool find132pattern(vector<int>& nums) {
        int n = nums.size();

        multiset<int> right;
        for (int num : nums) {
            right.insert(num);
        }

        int preMin = 1e9 + 1;
        for (int i = 0; i < n - 1; ++i) {
            right.erase(right.find(nums[i]));

            auto it = right.lower_bound(preMin + 1);

            if (nums[i] > preMin && it != right.end() && *it < nums[i]) {
                return true;
            }

            preMin = min(preMin, nums[i]);
        }

        return false;
    }
};

如果nums的大小是n,则此算法时间复杂度为O(nlogn),空间复杂度为O(n)。

相关推荐
ShineWinsu2 小时前
对于C++中unordered_set的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_set
二木九森2 小时前
LeetCode-寻找环形链表的入口
算法·leetcode·链表
菜菜小狗的学习笔记2 小时前
数据结构(三)哈希表
数据结构·散列表
飞Link2 小时前
耳机连接电脑时调节耳机音量电脑音量也会随着改变
算法·电脑
此方ls2 小时前
机器学习聚类算法一——K均值
算法·机器学习·聚类
再难也得平2 小时前
力扣73. 矩阵置零(Java解法)
算法·leetcode·矩阵
进击切图仔2 小时前
生成 .so 和使用 .so
java·javascript·算法
样例过了就是过了2 小时前
LeetCode热题100 岛屿数量
数据结构·c++·算法·leetcode·dfs
重生之后端学习2 小时前
300. 最长递增子序列
数据结构·算法·leetcode·职场和发展·排序算法·深度优先