返回
LeetCode 414. 第三大的数–算法巧思,三指针优雅解决
闲谈
2023-12-03 09:32:55
问题解析
LeetCode 414. 第三大的数的题目如下:
给定一个非空数组,返回此数组中第三大的数字。如果不存在第三大的数字,返回数组中最大的数字。
例如,给定数组 [3, 2, 1]
,返回 1
。
给定数组 [1, 2]
,返回 2
。
给定数组 [2, 2, 3, 1]
,返回 1
。
算法设计
这道题的本质是找到数组中第三大的数字。我们可以使用多种算法来解决它,这里介绍一种巧妙的三指针算法。
三指针算法
三指针算法的思想是使用三个指针 i
、j
和 k
来遍历数组。其中,i
指向数组的第一个元素,j
指向数组的第二个元素,k
指向数组的第三个元素。
算法的步骤如下:
- 初始化指针
i
、j
和k
为0
。 - 当
k
不指向数组的最后一个元素时,执行以下步骤:- 将
i
、j
和k
指向的三个元素与第三大的数字进行比较。 - 如果
k
指向的元素是第三大的数字,则将i
和j
分别指向j
和k
指向的元素,并将k
指向数组的下一个元素。 - 如果
k
指向的元素不是第三大的数字,则将k
指向数组的下一个元素。
- 将
- 返回
k
指向的元素。
算法分析
三指针算法的时间复杂度为 O(n)
,其中 n
是数组的长度。这是因为算法只需要遍历数组一次。
三指针算法的空间复杂度为 O(1)
,这是因为算法不需要使用额外的空间。
代码实现
def third_max(nums):
"""
:type nums: List[int]
:rtype: int
"""
# 初始化指针
i = 0
j = 1
k = 2
# 遍历数组
while k < len(nums):
# 将i、j、k指向的三个元素与第三大的数字进行比较
if nums[k] > nums[i] and nums[k] > nums[j]:
# 如果k指向的元素是第三大的数字,则将i和j分别指向j和k指向的元素,并将k指向数组的下一个元素
i = j
j = k
elif nums[k] > nums[i] and nums[k] < nums[j]:
# 如果k指向的元素不是第三大的数字,则将k指向数组的下一个元素
i = k
k += 1
# 返回k指向的元素
return nums[k]
总结
三指针算法是一种巧妙的算法,可以用来解决 LeetCode 414. 第三大的数这道题。算法的时间复杂度为 O(n)
,空间复杂度为 O(1)
。希望本文对您有所帮助,也欢迎您留言讨论。