【力扣题】题目描述:
【Python3】代码:
1、解题思路:使用集合去重,再转为列表。列表从大到小排列。
若列表长度超过3则有第三大值,返回下标为2的第三大值,若列表长度小于3则没有第三大值,返回下标为0的最大值。
知识点:set(...):转为集合。集合:无序、元素唯一、可变的序列。
list(...):转为列表。列表:有序、元素可重复、可变的序列。
列表.sort(reverse=True):列表降序排列(从大到小)。
class Solution:
def thirdMax(self, nums: List[int]) -> int:
# 使用集合去重,再转为列表
s = list(set(nums))
# 新列表降序排列
s.sort(reverse=True)
# 若新列表长度超过3,则返回第3大元素(从0开始,下标为2)
if len(s) >= 3: return s[2]
# 否则,返回最大元素(下标为0)
else: return s[0]
2、解题思路:一个变量d用于统计不同元素个数。列表从大到小排列。
遍历列表,依次将当前元素与前一个元素比较,若两元素不同,d+1,若d等于3,则为第三大值返回当前元素。
遍历完列表,没有第三大值,则返回下标为0的最大值。
class Solution:
def thirdMax(self, nums: List[int]) -> int:
nums.sort(reverse=True) # 列表降序排列
n = len(nums) # 列表长度
d = 1 # 统计不同元素的个数
# 遍历列表,依次比较2个元素,若不同,d+1,若d为3,返回该元素
for i in range(1, n):
if nums[i] != nums[i-1]:
d += 1
if d == 3:
return nums[i]
# 没有第三大元素,返回最大元素
return nums[0]
3、解题思路:三个变量依次为最大值、次大值、第三大值,初始均为无穷小。
遍历列表,判断当前元素:
- 若当前元素大于最大值,则当前元素为最大值,原最大值为次大值,原次大值为第三大值,
- 若当前元素小于最大值大于次大值,则当前元素为次大值,原次大值为第三大值,
- 若当前元素小于次大值大于第三大值,则当前元素为第三大值。
遍历完列表,若第三大值与初始值相同还是无穷小,则没有第三大值,返回最大值,否则返回第三大值。
知识点:float('-inf'):无穷小。
class Solution:
def thirdMax(self, nums: List[int]) -> int:
# a,b,c 分别为最大值、次大值、第三大值,初始为无穷小
a, b, c = float('-inf'), float('-inf'), float('-inf')
# 遍历列表每个元素
for i in nums:
if i > a: # 当前元素比最大值还大
a, b, c = i, a, b
elif a > i > b: # 当前元素比次大值大,次大值和第三大值都替换新值
b, c = i, b
elif b > i > c: # 当前元素比第三大值大,替换第三大值
c = i
# 若第三大值为初始值则没有第三大值,返回最大值,否则返回第三大值
return a if c == float('-inf') else c