常见的两种算法分别是:排序法和维护三个变量法。
排序法:
排序法的思路是:先把数组中的元素去重,然后按照从小到大的顺序排序,最后返回排序后的数组中倒数第三个元素,即第三大的元素。
# 排序法 时间复杂度:O(nlogn) 空间复杂度:O(n)
def third_num1(nums):
# 如果数组长度小于3,则返回最大值
if len(nums) < 3:
raise ValueError('数组中没有第三大的数')
# 否则返回第三大的值
else:
return sorted(set(nums))[-3]
维护三个变量法:
维护三个变量法的思路是:用三个变量来分别存储数组中第一大、第二大、第三大的元素,然后遍历数组,对于每个元素,根据它和三个变量的大小关系,更新三个变量的值,最后返回第三大的变量。
# 维护三个变量法 时间复杂度:O(n) 空间复杂度:O(1)
def third_num2(nums):
# 定义三个变量,分别存储第一大、大二大、大三大的值
first = second = third = float('-inf')
# 遍历数组
for num in nums:
# 如果当前值大于第一大的值,更新三个变量
if num > first:
third = second
second = first
first = num
# 如果当前值=第一大的值,跳过
elif num == first:
continue
# 如果当前值大于第二的值,更新后两个变量
elif num > second:
third = second
second = num
# 如果当前值=第二值,跳过
elif num == second:
continue
# 如果当前值大于第三大值,更新最后一个变量
elif num > third:
third = num
# 如果第三大的值仍为-inf,说明不存在,报错
if third == float('-inf'):
return ValueError('没有第三大的数')
else:
return third
first = second = third = float('-inf')
注解:定义三个变量,分别命名为 first, second, third,并且把它们的初始值都设为负无穷。
负无穷是一个特殊的数值,它表示一个比任何有限的数都要小的数。在 Python 中,可以用 float(‘-inf’) 来表示负无穷。
这样做的目的是,为了方便后面的比较,让三个变量都从一个最小的数开始,然后逐渐更新为数组中更大的数。