给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
a. 1 <= nums.length <= 104
b. -231 <= nums[i] <= 231 - 1
参考 寻找序列中最大数值的方法——擂台法:一次遍历,每次数值 和 擂主比较,只有 擂主输了即数值更小,才 更换 擂主。
该题 使用3个等级的擂主 a、b、c 来维护,存放 最大值、次大值、第三大值,也是 一次遍历。
遍历过程中,只有当 数值 大小在某个区间,如(a,)、(b,a)、(c,b),才会更换擂主,不考虑相同值。
注意的是,3个擂主 的初值 都是最小值,并且 最后 返回结果时,只有当 c不为 初值即最小值,才返回 c,否则返回 a,即最大值。
此外,另一种不依赖元素范围的做法是,将 a、b 和 c 初始化为空指针或空对象,视作「无穷小」,并在比较大小前先判断是否为空指针或空对象。遍历结束后,若 c 为空,则说明第三大的数不存在,返回 a,否则返回 c。
形式:
float("INF")表示为正无穷;
float("-INF")表示负无穷
有序集合来维护数组中前三大的数。
每遍历一个数,就将其插入有序集合,若有序集合的大小超过 3,就删除集合中的最小元素。
遍历结束后,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 3,那么就返回有序集合中的最大值。
def thirdMax(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) < 3:
return max(nums)
import sys
a, b, c = -sys.maxsize - 1, -sys.maxsize - 1, -sys.maxsize - 1
for num in nums:
if c < num < b:
c = num
elif b < num < a:
b, c = num, b
elif num > a:
a, b, c = num, a, b
return a if c == -sys.maxsize - 1 else c