0
点赞
收藏
分享

微信扫一扫

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

年迈的代码机器 2022-01-20 阅读 53

文章目录

题目描述

思路分析

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

我们要找到是否存在递增的三个数。
最优方案要使第一个数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
举报

相关推荐

0 条评论