leetcode:递增的三元子序列

这篇具有很好参考价值的文章主要介绍了leetcode:递增的三元子序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递增的三元子序列

题解部分转自leetcode:Xzz

medium

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false

示例 1:

输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意

示例 2:

输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组

示例 3:

输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

**进阶:**你能实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案吗?

一、题目信息剖析
划重点:给定一个 未排序 的数组,判断这个数组中是否 存在 长度为 3 的 递增 子序列。

所以我们优化算法的根本来源在于抓住 存在 和 长度为3 这个重点进行优化。

题目只需要我们判断存在即可,所以我们只需要找出一个满足题意的条件即可。

要求:O(n)O(n)O(n)的时间复杂度,即遍历一遍数组,要求O(1)O(1)O(1)的空间复杂度,即不使用额外空间。

二、思路详解
核心想法:遍历一遍数组,希望遍历到的这个数three,前面已经有一个比他小的数two,再前面有一个比two小的数one。 我们需要维护两个变量:onetwo。代表递增子序列的第一个数和第二个数。 假设我们已经有了这两个数,那么three的大小有以下三种情况:

  1. three大于two

此情况下:即找到了三元组,直接返回true。

  1. three介于two和one之间

(three<=two && three>one)

此情况下:应更新two,赋值为这个更小的值。 这相当于帮我们扩大了three的可选择范围,当再次遇到一个比更新过的two大的数即可找到。

  1. three小于one

此情况下:应更新one,赋值为这个更小的值。而不需要动two。 这相当于帮我们扩大了之后出现的two的可选择范围。进而扩大了之后出现的three的可选择范围。

需要注意的是,我们只更新one,原先的two不需要更改,因为子序列是从前往后的,只有当之后再出现比two小的数的时候再按照第二步那样更改。

假设有如下示例:[2,5,1,6],在遇到1之后更新了one,后遇到6,因为先判断是否大于two,由于6大于5,就直接返回true了。

注意:two附带隐含信息——这之前有个数比two小 所以此时找到的递增子序列不是one、two、three的1 5 6,而是old one、two、three的2 5 6。

这里更新的one的意思是,为之后可能存在的更小的递增子序列打基础。 假设有如下示例:[2,5,1,2,6],在遇到1之后更新了one,后遇到2,2介于1和5(two)之间,更新two为2,后遇到6,由于6大于2,返回true。 此时找到的递增子序列才是one、two、three的1 2 6

最后考虑one、two的初值,容易想到设定为Integer.MAX_VALUE (float(“inf”) 正无穷大即可。

三、代码文章来源地址https://www.toymoban.com/news/detail-545490.html

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        one = two = float('inf') # 初始化子序列第一个数和第二个数为正无穷大
        for three in nums:#子序列第三个数遍历数组
            if three > two:# 第三个数大于第二个数则存在一个递增
                return True

            elif three <= one:# 第三个数小于等于第一个数,将第三个数赋值给第一个数
                one = three
            
            elif three > one and three <= two:# 第三个数大于第一个数并且小于等于第二个数时,将第三个数赋值给第二个数
                two = three
                
        return False# 遍历完成没有找到符合的递增序列返回False

到了这里,关于leetcode:递增的三元子序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode300. 最长递增子序列(动态规划-java)

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/longest-increasing-subsequence 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序

    2024年02月15日
    浏览(34)
  • 【LeetCode: 673. 最长递增子序列的个数 | 动态规划】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月03日
    浏览(55)
  • 【算法|动态规划No.7】leetcode300. 最长递增子序列

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月07日
    浏览(36)
  • 递增的三元子序列

    递增的三元子序列 1 = nums.length = 500000 子序列的三个元素在原数组中可以不是连续的 实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案 使用贪心算法,在遍历数组时,要记录当前数组中的最小值minVal (方便找第二小的值)以及递增二元组中的较大值tupleMaxVal (方便找递

    2024年01月23日
    浏览(27)
  • 334. 递增的三元子序列

    首先想到的方法是维护左最小值和右最大值数组,然后判断是否当前值为中间值。 看了题解后发现了一个很棒的法,时间复杂度O(N),空间复杂度O(1). 首先,维护第一第二个数两个变量,如果当前数大于第二数则存在三元组,如果大于第一数则更新第二数,否则更新第一数。

    2024年02月15日
    浏览(26)
  • 【贪心算法】334. 递增的三元子序列

    找到的递增序列 不一定是连续的 固定第一个数first 然后开始向后找第二个数second 要求second 大于 first 找到之后 向后找第三个数third 找到 返回true 如果third first 那么更新first = third 重新找 如果只是third first 更新second

    2024年02月16日
    浏览(33)
  • ( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

    难度:简单 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l r) 确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月05日
    浏览(40)
  • LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 往期回顾:LeetCode 单周赛第 346 场 · 仅 68 人 AK 的最短路问题 T1. 移除字符串中的尾随零(Easy) 标签:模拟、字符串 T2. 对角线上不同值的数量差(Easy) 标签:前后缀分解 T3. 使所有字符相等的最小

    2024年02月06日
    浏览(37)
  • 算法训练day37|贪心算法 part06(LeetCode738.单调递增的数字)

    题目链接🔥🔥 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是单调递增的。) 示例 1: 输入: N = 10 输出: 9 示例 2: 输入: N = 1234 输出:

    2024年02月09日
    浏览(28)
  • Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列

    目录 332. 重新安排行程 Reconstruct Itinerary  🌟🌟🌟 334. 递增的三元子序列 Increasing Triplet Subsequence 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一份航线列表  tickets  ,其中  tickets[i]

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包