leetcode(力扣) 334. 递增的三元子序列(贪心策略)

题目描述

给你一个整数数组 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

思路分析

注意题目中所说的是递增子序列,并不需要连续。

我们要找到是否存在递增的三个数。
最优方案要使第一个数first尽可能的小。
第二个数second比first大且尽可能地小。
此时只需要再找到一个数大于second即找到答案。

冒出一个思路,很可能是贪心,可以维护两个指针,第一个指针指向first,第二个指针指向second,使得在条件first<second下 两个数尽可能的小。如是有下面的思路:

  • 设数组的第一个数为 first
  • 设第二个数second为无穷大
  • 此时遍历数组,如果找到一个数大于second,说明找到了第三个数,则直接返回True。
  • 继续往后,如果找到一个数大于first但小于second,则更新second。
  • 继续往后,说明这个数既不大于second,也不大于first。则更新first。

完整代码

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        if len(nums) < 3 or len(set(nums)) < 3:
            return False
        first = nums[0];
        second = float('inf') # 初设为无穷大
        for i in range(len(nums)):
            if  nums[i] > second: # 说明已经找到一个数大于第二个数,即找到third这个数
                return  True
            if nums[i] > first: # 说明找到一个数 小于sencond 大于first  则说明找到了一个比second更小的数,更新second
                second = nums[i]
            else: # 说明找到一个数字 比fisrt更小 则更新first
                first = nums[i]
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值