Vison's Blog
所有文章
文章总览
编辑器
Publications
About Me
Search
目录
#toc-container
下载Markdown文件
【3.24】LeetCode每日一题· 132 模式
2021年03月24日 10时36分
标签:
LeetCode
数组
树形结构
## 题目描述 给你一个整数数组`nums`,数组中共有`n`个整数。**132 模式的子序列**由三个整数`nums[i]`、`nums[j]`和`nums[k]`组成,并同时满足:`i < j < k`和`nums[i] < nums[k] < nums[j]`。 如果`nums`中存在** 132 模式的子序列**,返回`true`;否则,返回`false`。 进阶:很容易想到时间复杂度为`O(n^2)`的解决方案,你可以设计一个时间复杂度为`O(n logn)`或`O(n)`的解决方案吗? #### 示例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 <= 10^4 -10^9 <= nums[i] <= 10^9 ``` #### 来源 > 来源:力扣(LeetCode) > 链接:[题目链接](https://leetcode-cn.com/problems/132-pattern "题目链接") ## 解题思路 容易想到如果枚举**3(即j)**那么,可以维护在**j**左边的子数组的最小值`minn`,然后查询**j**右边的子数组中是否存在大于`minn`且小于`nums[j]`的**k**即可。如果存在这种**k**,就说明序列中存在132模式的子序列;反之存在。 由于枚举**j**需要$$O(n)$$的时间,因此问题就变成如何设计一种数据结构,这种数据结构可以在不高于$$O(\log n)$$时间内: 1. 删除某一元素; 2. 查找第一个大于某一个值的元素(或小于某一个值的元素); 因此,我们可以使用有序集容器实现。 考虑到数组中会包含重复数字,可以使用STL中的`multiset`。 1. 使用`erase(iterater it)`可以删除迭代器`it`所指向的值,这个迭代器可以通过`lower_bound(key_type value)`找到(`lower_bound`的功能是返回第一个值大于**等于**`value`的迭代器) 2. `upper _bound(key_type value)`能够找到第一个值**大于**`value`的迭代器。 因此就设计出了$$O(n\log n)$$的算法。 Tips:本题还能使用[单调栈](https://leetcode-cn.com/problems/132-pattern/solution/132mo-shi-by-leetcode-solution-ye89/),在$$O(n)$$时间复杂度内实现,留个坑待填。 ### 代码 ```cpp class Solution { public: bool find132pattern(vector
& nums) { multiset
st; int minn = nums[0]; for(int i = 1; i < nums.size(); i++){ st.insert(nums[i]); } for(int i = 1; i < nums.size()-1; i++){ // minn 充当 1; nums[i] 充当 3; 在nums[i+1:]中找到一个2 minn = min(minn, nums[i-1]); st.erase(st.lower_bound(nums[i])); multiset
::iterator it = st.upper_bound(minn); if(it != st.end() && *it < nums[i]){ return true; } } return false; } }; ``` ## 用时和内存 > 执行用时:36 ms,在所有 C++提交中击败了21.61%的用户 > 内存消耗:16.8 MB,在所有 C++提交中击败了5.09%的用户
所有评论
暂无评论
新增评论
评论
邮箱
邮箱仅作验证使用
图形验证码
邮箱验证码
发送验证码
发表评论
所有评论
暂无评论