返回

LeetCode 414. 第三大的数–算法巧思,三指针优雅解决

闲谈

问题解析

LeetCode 414. 第三大的数的题目如下:

给定一个非空数组,返回此数组中第三大的数字。如果不存在第三大的数字,返回数组中最大的数字。

例如,给定数组 [3, 2, 1],返回 1
给定数组 [1, 2],返回 2
给定数组 [2, 2, 3, 1],返回 1

算法设计

这道题的本质是找到数组中第三大的数字。我们可以使用多种算法来解决它,这里介绍一种巧妙的三指针算法。

三指针算法

三指针算法的思想是使用三个指针 ijk 来遍历数组。其中,i 指向数组的第一个元素,j 指向数组的第二个元素,k 指向数组的第三个元素。

算法的步骤如下:

  1. 初始化指针 ijk0
  2. k 不指向数组的最后一个元素时,执行以下步骤:
    • ijk 指向的三个元素与第三大的数字进行比较。
    • 如果 k 指向的元素是第三大的数字,则将 ij 分别指向 jk 指向的元素,并将 k 指向数组的下一个元素。
    • 如果 k 指向的元素不是第三大的数字,则将 k 指向数组的下一个元素。
  3. 返回 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)。希望本文对您有所帮助,也欢迎您留言讨论。