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      # 返回第三大数或第一个大数

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

你可能感兴趣的:(414. 第三大的数(Python))