📜  谜题 69 |数字游戏(1)

📅  最后修改于: 2023-12-03 14:57:45.426000             🧑  作者: Mango

谜题 69 | 数字游戏

题目描述

给定一个整数数组 nums,请你找出其中所有的第三大的数。

如果不存在第三大的数,则返回数组中最大的数。

要求算法时间复杂度必须是 O(n)。

示例

示例 1

输入: [3, 2, 1]

输出: 1

解释: 第三大的数不存在, 所以返回最大的数 1 。

示例 2

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 。

示例 3

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,而不是第三大的不同数,故返回最大的 1 。

解法

方法一

使用 Python 语言,可以使用 set 去重、排序后取值的方式,也可以使用 heapq 模块找第三大的元素。首先,对列表去重和排序。然后,依次遍历去重后的列表,取前三个元素和当前元素比较即可。

时间复杂度为 O(nlogn)。

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        nums = sorted(list(set(nums)))
        if len(nums) < 3:
            return nums[-1]
        return nums[-3]

方法二

使用 Python 语言,我们可以使用三个变量分别保存第一大、第二大和第三大的元素,遍历列表,更新三个变量即可。

时间复杂度为 O(n)。

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        first = second = third = float('-inf')
        for num in nums:
            if num > first:
                third, second, first = second, first, num
            elif first > num > second:
                third, second = second, num
            elif second > num > third:
                third = num
        return third if third != float('-inf') else first
复杂度分析
  • 时间复杂度:方法一为 O(nlogn),方法二为 O(n)。
  • 空间复杂度:方法一和方法二均为 O(1)。