📅  最后修改于: 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)。
这三种方法的适用场景各有不同。对于数据量较小的情况,可以使用方法二;对于数据量较大的情况,可以使用方法三;对于需要频繁查询的情况,可以使用方法一。