题目

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.递增的三元子序列相关推荐

  1. Leetcode 334.递增的三元子序列

    原题链接: Leetcode 334.递增的三元子序列 Given an integer array nums, return true if there exists a triple of ind ...

  2. Python描述 LeetCode 334. 递增的三元子序列

    Python描述 LeetCode 334. 递增的三元子序列   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端 ...

  3. 【LeetCode】334. 递增的三元子序列

    一.题目 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] ...

  4. Java实现 LeetCode 334 递增的三元子序列

    334. 递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ...

  5. 334. 递增的三元子序列(中等 贪心 数组)

    334. 递增的三元子序列 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 ...

  6. 334. 递增的三元子序列

    334. 递增的三元子序列 难度:中等 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < ...

  7. 334. 递增的三元子序列 increasingTriplet

    >累加数< >isAdditiveNumber< 一.解题思路 1.解法一( Java ) 解法思路:贪心算法 (图源自此) 对于要寻找的三元组 (min,mid,max),记 ...

  8. LeetCode每日一题打卡组队监督!刷题群!

    近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...

  9. 关于LeetCode每日一题打卡失败的感悟

    背景 今年5月,报名参加了三叶姐的"五月打卡活动",押金29.9元,要求每天在力扣上每日一题打卡,完成则押金全退,完不成则押金不退. 事件 2022.5.10,LeetCode上的 ...

最新文章

  1. SMO学习笔记(二)——还原(恢复)篇之完整恢复
  2. html5中preclass,为什么HTML5建议把代码元素放在pre?
  3. CCNA实验(8) -- PPP HDLC
  4. React 第七章 条件渲染
  5. 富士康被黑客攻击,索要 2.3 亿元赎金:已加密约1200台服务器,窃取了100 GB的未加密文件,并删除20~30TB的备份
  6. mysql 5.6 升级问题_mysql5.6升级5.7带来的问题
  7. Tableau可视化学习笔记:day11-12
  8. JAVA系统学习之三大版本JavaSE、javaEE、javaME
  9. 国产单路AHDRX芯片XS9950,替代TP9950
  10. 华硕CSM不能设置解决方案
  11. 写给XJTU计算机系大一大二的童鞋
  12. linux搭建智能dns步骤,PDNS实现智能DNS配置步骤linux操作系统 -电脑资料
  13. Nginx优化与防盗链
  14. 炸⾦花棋牌游戏Python
  15. 用session和mysql实现购物车_Session和Cookie实现购物车
  16. Outlook2007設置未讀郵件為紅色
  17. java信息化平台_Java开源企业信息化平台O2OA接入企业钉钉
  18. python读文件完整代码_Python读写文件的代码示例
  19. 站长说说之SEO让流量翻倍的策略分享
  20. 路平石模具铺设路缘石公路项目质量提升的过程

热门文章

  1. Sine之舞 真的会跳舞哇,c语言实现
  2. [Codevs] 一塔湖图
  3. 暗影精灵系列更换电池后电池无法充满无法充电解决方案
  4. 记录一次京东物流面试(应届生)
  5. 形容口蜜腹剑图片_“口蜜腹剑”形容一个人两面三刀,可你知道成语说的是谁吗?...
  6. 如何查看海思SDK的版本
  7. excel-多行内容分组合并-分类汇总(汇总不求和只合并内容)
  8. 70道经典Android面试题加答案--重要知识点几乎都涉及到了 .
  9. zzulioj1102: 火车票退票费计算(函数专题)
  10. 人脸识别5.1.2- insightface人脸检测模型RetinaFace-Paddle