📌  相关文章
📜  一系列不同元素中的第三大元素(1)

📅  最后修改于: 2023-12-03 15:06:10.189000             🧑  作者: Mango

一系列不同元素中的第三大元素

在编程中,我们经常会遇到需要找到一系列不同元素中的第三大元素的情况。本文将介绍几种常用的解决方法。

方法一:排序

最简单的方法就是对元素进行排序,然后直接输出第三大的元素即可。

def thirdMax(nums):
    nums = sorted(list(set(nums)), reverse=True)
    if len(nums) < 3:
        return nums[0]
    else:
        return nums[2]

使用set去重并转换为列表,然后对列表进行倒序排序。利用Python语言提供的优雅特性,一行代码解决问题。

该方法的时间复杂度为O(nlogn),空间复杂度为O(n)。

方法二:遍历

如果数据较小,则可以使用遍历的方式找到第三大的元素。我们使用三个变量,分别保存最大的数、第二大的数和第三大的数。如果当前数比这三个数都大,就更新这三个数的值。直到遍历完成。

def thirdMax(nums):
    max1 = max2 = max3 = -float('inf')
    for num in nums:
        if num > max1:
            max3, max2, max1 = max2, max1, num
        elif max1 > num > max2:
            max3, max2 = max2, num
        elif max2 > num > max3:
            max3 = num
    return max3 if max3 != -float('inf') else max1

该方法的时间复杂度为O(n),空间复杂度为O(1)。

方法三:使用堆

堆可以快速找到最大的数,因此我们可以维护一个大小为3的最大堆。遍历数组,将元素加入堆中,如果堆的大小超过3,就弹出堆顶元素。

import heapq

def thirdMax(nums):
    heap = []
    for num in set(nums):
        heapq.heappush(heap, -num)
        if len(heap) > 3:
            heapq.heappop(heap)       
    return -heap[0] if len(heap) == 3 else max(nums)

需要注意的是:堆中保存的是元素的相反数,以便使用heapq模块提供的最小堆实现。因此,在返回第三大元素的时候,需要取相反数。同时,如果最终堆的大小为3,即存在第三大元素,直接返回堆顶元素的相反数;否则,返回列表中的最大值。

该方法的时间复杂度为O(nlog3),空间复杂度为O(3)。

这三种方法的适用场景各有不同。对于数据量较小的情况,可以使用方法二;对于数据量较大的情况,可以使用方法三;对于需要频繁查询的情况,可以使用方法一。