Repository navigation
Expand file tree
/
Copy path414_topic.py
More file actions
100 lines (74 loc) · 2.69 KB
/
Copy path414_topic.py
File metadata and controls
100 lines (74 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能设计一个时间复杂度 O(n) 的解决方案吗?
"""
class Solution(object):
def thirdMax(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 方法1:使用set去重然后排序(简单但时间复杂度不是O(n))
nums_set = set(nums)
nums_set_sort = sorted(list(nums_set))
n = len(nums_set_sort)
if n <= 2:
return nums_set_sort[-1]
else:
return nums_set_sort[-3]
def best(self, nums):
"""
方法2:一次遍历法(满足O(n)时间复杂度要求)
注意:这里不需要显式去重,因为在更新逻辑中自然处理了重复元素
"""
first = second = third = float('-inf')
for num in nums:
# 跳过重复数字(已经在first, second, third中的数字)
if num in (first, second, third):
continue
if num > first:
first, second, third = num, first, second
elif num > second:
second, third = num, second
elif num > third:
third = num
# 如果找到了第三大的数,返回它;否则返回最大的数
return third if third != float('-inf') else first
if __name__ == '__main__':
# 测试用例
s = Solution()
# 示例1
list1 = [3, 2, 1]
print(f"输入: {list1}")
print(f"输出: {s.best(list1)}") # 应该输出 1
# 示例2
list2 = [1, 2]
print(f"输入: {list2}")
print(f"输出: {s.best(list2)}") # 应该输出 2
# 示例3 - 关键测试用例
list3 = [2, 2, 3, 1]
print(f"输入: {list3}")
print(f"输出: {s.best(list3)}") # 应该输出 1
# 额外测试用例
list4 = [1, 2, 2, 5, 3, 5]
print(f"输入: {list4}")
print(f"输出: {s.best(list4)}") # 应该输出 2 (去重后是[1,2,3,5],第三大是2)
list5 = [1, 1, 1]
print(f"输入: {list5}")
print(f"输出: {s.best(list5)}") # 应该输出 1