LeetCode 每日一题打卡:334.递增的三元子序列
题目
334.递增的三元子序列
题目大意
给你一个整数数组numsnumsnums ,判断这个数组中是否存在长度为333的递增子序列。
如果存在这样的三元组下标(i,j,k)(i, j, k)(i,j,k)且满足i<j<ki < j < ki<j<k,使得 nums[i]<nums[j]<nums[k]nums[i] < nums[j] < nums[k]nums[i]<nums[j]<nums[k] ,返回 truetruetrue ;否则,返回 falsefalsefalse 。
样例
数据规模
思路1
考虑比较容易想到的做法:
假如数组大小小于3,直接返回falsefalsefalse。
每次考虑将数字nums[i]nums[i]nums[i]作为三元序列的中间数,那么就需要考虑数组[0,i−1][0,i-1][0,i−1]是否存在一个数字小于nums[i]nums[i]nums[i],这个很容易做到:在顺序遍历数组的时候维护一个minn表示[0,i−1][0,i-1][0,i−1]之前的最小数。然后还需要考虑数组[i+1,n−1](n=数组大小)[i+1,n-1](n= 数组大小)[i+1,n−1](n=数组大小)之前存在一个数字大于nums[i],这个就没办法像刚才维护minn一样维护maxx,并且是从0到n-1进行遍历,意味着维护的数字的数量在不断减少,意味着最大值也可能发生不同的变化。考虑简单的做法:维护一个multiset,在遍历的时候每次弹出一个等于nums[i]nums[i]nums[i]的数字,相当于nums[i]nums[i]nums[i]从multiset中删除(因为一开始multiset是加入了数组[1,n−1][1,n-1][1,n−1]的所有数字),然后二分查找是否存在一个数字大于nums[i]nums[i]nums[i],如果不存在,返回的迭代器就是multiset.end()。这样就可以通过维护minn和multiset来寻找一个三元子序列。(时间复杂度O(nlogn)O(nlogn)O(nlogn))
代码1
class Solution {public:bool increasingTriplet(vector<int>& nums) {int n=nums.size();if(n<3)return 0;multiset<int>s1,s2;for(int i=n-1;i>=1;i--)s2.insert(nums[i]);int minn=nums[0];for(int i=1;i<n-1;i++){s2.erase(s2.find(nums[i]));auto it2=s2.upper_bound(nums[i]);if(minn<nums[i]&&it2!=s2.end())return 1;minn=min(minn,nums[i]);}return 0;}
};
思路2
使用贪心的方法将空间复杂度降到O(1)O(1)O(1)。从左到右遍历数组numsnumsnums,维护两个变量minn1和minn2,分别作为三元子序列的第一个数字和第二个数字,并且保证first<secondfirst<secondfirst<second(出现顺序&数字大小都是如此)。
初始:first=nums[0],second=inffirst=nums[0],second=inffirst=nums[0],second=inf。
当遍历到nums[i]nums[i]nums[i]时,有如下操作:
- 如果nums[i]>secondnums[i]>secondnums[i]>second,说明找到了一个递增的三元子序列,返回truetruetrue;
- 如果nums[i]<=second,nums[i]>firstnums[i]<=second ,nums[i]>firstnums[i]<=second,nums[i]>first ,那么更新second=nums[i]second=nums[i]second=nums[i];
- 否则更新first=nums[i]first=nums[i]first=nums[i];
如果遍历结束时没有找到递增的三元子序列,返回falsefalsefalse。
需要递增的三元子序列的过程要求:firstfirstfirst和secondsecondsecond应该尽可能地小,这样找到递增的三元子序列的可能性更大。
要求first<secondfirst<secondfirst<second(出现顺序&数字大小都是如此),所以遇到nums[i]>secondnums[i]>secondnums[i]>second,此时first一定出现在second前面,所以(first,second,nums[i])(first,second,nums[i])(first,second,nums[i])一定是递增的三元子序列。
考虑一个比较问题:如果遍历过程中遇到小于firstfirstfirst的元素,则会用该元素更新firstfirstfirst,这导致了first顺序在second之后,是否会出现误判?
不会。虽然更新后的firstfirstfirst出现在secondsecondsecond的后面,但是second之前必然有一个比second小的数字first′first'first′,如果突然遇到了nums[i]>secondnums[i]>secondnums[i]>second,那么一定有递增三元序列(first′,second,nums[i])(first',second,nums[i])(first′,second,nums[i])。
代码2
class Solution {public:bool increasingTriplet(vector<int>& nums) {int minn1=nums[0],minn2=(1ll<<31)-1;for(int i=1;i<nums.size();i++){if(nums[i]>minn2)return 1;else if(nums[i]>minn1)minn2=nums[i];else minn1=nums[i];}return 0;}
};
LeetCode 每日一题打卡:334.递增的三元子序列相关推荐
- Leetcode 334.递增的三元子序列
原题链接: Leetcode 334.递增的三元子序列 Given an integer array nums, return true if there exists a triple of ind ...
- Python描述 LeetCode 334. 递增的三元子序列
Python描述 LeetCode 334. 递增的三元子序列 大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端 ...
- 【LeetCode】334. 递增的三元子序列
一.题目 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] ...
- Java实现 LeetCode 334 递增的三元子序列
334. 递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ...
- 334. 递增的三元子序列(中等 贪心 数组)
334. 递增的三元子序列 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 ...
- 334. 递增的三元子序列
334. 递增的三元子序列 难度:中等 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < ...
- 334. 递增的三元子序列 increasingTriplet
>累加数< >isAdditiveNumber< 一.解题思路 1.解法一( Java ) 解法思路:贪心算法 (图源自此) 对于要寻找的三元组 (min,mid,max),记 ...
- LeetCode每日一题打卡组队监督!刷题群!
近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...
- 关于LeetCode每日一题打卡失败的感悟
背景 今年5月,报名参加了三叶姐的"五月打卡活动",押金29.9元,要求每天在力扣上每日一题打卡,完成则押金全退,完不成则押金不退. 事件 2022.5.10,LeetCode上的 ...
最新文章
- SMO学习笔记(二)——还原(恢复)篇之完整恢复
- html5中preclass,为什么HTML5建议把代码元素放在pre?
- CCNA实验(8) -- PPP HDLC
- React 第七章 条件渲染
- 富士康被黑客攻击,索要 2.3 亿元赎金:已加密约1200台服务器,窃取了100 GB的未加密文件,并删除20~30TB的备份
- mysql 5.6 升级问题_mysql5.6升级5.7带来的问题
- Tableau可视化学习笔记:day11-12
- JAVA系统学习之三大版本JavaSE、javaEE、javaME
- 国产单路AHDRX芯片XS9950,替代TP9950
- 华硕CSM不能设置解决方案
- 写给XJTU计算机系大一大二的童鞋
- linux搭建智能dns步骤,PDNS实现智能DNS配置步骤linux操作系统 -电脑资料
- Nginx优化与防盗链
- 炸⾦花棋牌游戏Python
- 用session和mysql实现购物车_Session和Cookie实现购物车
- Outlook2007設置未讀郵件為紅色
- java信息化平台_Java开源企业信息化平台O2OA接入企业钉钉
- python读文件完整代码_Python读写文件的代码示例
- 站长说说之SEO让流量翻倍的策略分享
- 路平石模具铺设路缘石公路项目质量提升的过程
热门文章
- Sine之舞 真的会跳舞哇,c语言实现
- [Codevs] 一塔湖图
- 暗影精灵系列更换电池后电池无法充满无法充电解决方案
- 记录一次京东物流面试(应届生)
- 形容口蜜腹剑图片_“口蜜腹剑”形容一个人两面三刀,可你知道成语说的是谁吗?...
- 如何查看海思SDK的版本
- excel-多行内容分组合并-分类汇总(汇总不求和只合并内容)
- 70道经典Android面试题加答案--重要知识点几乎都涉及到了 .
- zzulioj1102: 火车票退票费计算(函数专题)
- 人脸识别5.1.2- insightface人脸检测模型RetinaFace-Paddle