题目
难度:★★☆☆☆
类型:数组
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例
示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
解答
下面是一个比较容易理解的解法,一趟遍历的同时,找到最大、次大和第三大数。
class Solution:
def thirdMax(self, nums):
top1, top2, top3 = float('-inf'), float('-inf'), float('-inf')
for num in nums:
if num == top1 or num == top2 or num == top3: # 遇到相同的数
continue # 跳过
if num > top1: # 遇到了比三个数都大的数
top1, top2, top3 = num, top1, top2 # 更新三个最大数
elif num > top2: # 基于最大与次大数之间
top2, top3 = num, top2 # 更新后两个数
elif num > top3: # 介于次大和第三大数之间
top3 = num # 更新第三大数
return top1 if top3 == float('-inf') else top3 # 返回第三大数或第一个大数
也有三趟遍历进行寻找的方式,看上去会更快一些:
class Solution(object):
def thirdMax(self, nums):
top1, top2, top3 = float('-inf'), float('-inf'), float('-inf')
length = len(nums)
# 一趟遍历寻找第一大数
for i in range(length):
if nums[i] > top1:
top1 = nums[i]
# 第二趟遍历寻找次大数
for i in range(length):
if top2 < nums[i] < top1:
top2 = nums[i]
# 第三趟遍历寻找第三大数
for i in range(length):
if top3 < nums[i] < top2:
top3 = nums[i]
return top1 if top3 == float('-inf') else top3 # 返回第三大数或第一个大数
如有疑问或建议,欢迎评论区留言~