414. 第三大的数(Python)

题目

难度:★★☆☆☆
类型:数组

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例

示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.

示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

解答

下面是一个比较容易理解的解法,一趟遍历的同时,找到最大、次大和第三大数。

class Solution:
    def thirdMax(self, nums):
        top1, top2, top3 = float('-inf'), float('-inf'), float('-inf')
        for num in nums:
            if num == top1 or num == top2 or num == top3:   # 遇到相同的数
                continue                                    # 跳过
            if num > top1:                                  # 遇到了比三个数都大的数
                top1, top2, top3 = num, top1, top2          # 更新三个最大数
            elif num > top2:                                # 基于最大与次大数之间
                top2, top3 = num, top2                      # 更新后两个数
            elif num > top3:                                # 介于次大和第三大数之间
                top3 = num                                  # 更新第三大数
        return top1 if top3 == float('-inf') else top3      # 返回第三大数或第一个大数

也有三趟遍历进行寻找的方式,看上去会更快一些:

class Solution(object):
    def thirdMax(self, nums):
        top1, top2, top3 = float('-inf'), float('-inf'), float('-inf')
        length = len(nums)

        # 一趟遍历寻找第一大数
        for i in range(length):
            if nums[i] > top1:
                top1 = nums[i]

        # 第二趟遍历寻找次大数
        for i in range(length):
            if top2 < nums[i] < top1:
                top2 = nums[i]
                
        # 第三趟遍历寻找第三大数
        for i in range(length):
            if top3 < nums[i] < top2:
                top3 = nums[i]

        return top1 if top3 == float('-inf') else top3      # 返回第三大数或第一个大数

如有疑问或建议,欢迎评论区留言~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,417评论 0 4
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,105评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,272评论 0 4
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,846评论 0 10
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32