返回

探索 LeetCode 第 414 题:寻觅第三大的数

见解分享

LeetCode 第 414 题:第三大的数

导言

LeetCode 是一个备受青睐的在线编程竞赛平台,提供了一系列编程难题,难度不等,供用户练习和磨练。第 414 题“第三大的数”属于中等难度,是对我们数组处理和排序能力的考验。本文将深入探讨此难题,介绍其定义、解决思路,并提供 Python 和 Java 语言的实现。

问题定义

给定一个非空的整数数组 nums,其中可能存在重复元素,要求找出数组中第三大的数。倘若数组中不存在第三大的数,则返回数组中最大的数。

解决思路

解决此难题的关键在于透彻理解题目要求:寻找第三大的数。我们可采用以下步骤:

  1. 排序数组: 首先,按照降序对数组 nums 进行排序。排序后,第三大的数将位于索引 2 处(如果存在)。
  2. 验证数组长度: 如果数组长度不足 3,则不存在第三大的数。在这种情况下,返回数组中的最大值(索引 0 处)。
  3. 元素比较: 比较索引 2 处的元素与索引 0 处(最大值)或索引 1 处(次大值)的元素。如果它们相等,则继续比较下一个索引,直至找到一个不重复的元素。

Python 实现

def third_max(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    nums.sort(reverse=True)  # 降序排序数组
    
    # 如果数组长度不足 3,返回最大值
    if len(nums) < 3:
        return nums[0]
    
    third_max = nums[2]  # 初始化第三大值为索引 2 处的元素
    
    # 如果第三大值与最大值或次大值相等,则继续比较下一个索引
    if third_max == nums[0] or third_max == nums[1]:
        i = 3
        while i < len(nums) and third_max == nums[i]:
            i += 1
        if i < len(nums):  # 如果找到了不重复的元素
            third_max = nums[i]
    
    return third_max  # 返回第三大值

Java 实现

public int thirdMax(int[] nums) {
    Integer max1 = null;
    Integer max2 = null;
    Integer max3 = null;
    
    for (int num : nums) {
        // 忽略与最大值、次大值、第三大值相等的元素
        if ((max1 != null && num == max1) || (max2 != null && num == max2) || (max3 != null && num == max3)) {
            continue;
        }
        
        // 更新最大值、次大值、第三大值
        if (max1 == null || num > max1) {
            max3 = max2;
            max2 = max1;
            max1 = num;
        } else if (max2 == null || num > max2) {
            max3 = max2;
            max2 = num;
        } else if (max3 == null || num > max3) {
            max3 = num;
        }
    }
    
    // 如果第三大值不存在,返回最大值
    return max3 == null ? max1 : max3;
}

复杂度分析

  • 时间复杂度: O(n log n),其中 n 为数组 nums 的长度。排序数组需要 O(n log n) 的时间。
  • 空间复杂度: O(1),因为我们只使用有限的额外空间来存储排序后的数组元素。

结论

通过结合排序和比较技巧,我们可以有效地解决 LeetCode 第 414 题“第三大的数”。本文提供了清晰的解题思路和 Python 和 Java 语言的实现示例,帮助您全面理解并掌握此题的解决方法。

常见问题解答

  1. 如果数组中存在多个第三大的数,该怎么办?

    • 我们的算法将返回第一个找到的第三大数。
  2. 如果数组中包含大量重复的元素,会影响算法的性能吗?

    • 由于数组在排序前会删除重复元素,因此不会影响算法的性能。
  3. 算法是否可以用于查找数组中的第四大或更大数?

    • 算法可以轻松修改为查找第 k 大的数,只需修改代码中的一些逻辑即可。
  4. 排序数组时,是否可以使用其他排序算法?

    • 可以,但快速排序通常是数组排序的最佳选择。
  5. 算法是否可以用作一般情况下的第三大数查找工具?

    • 是的,算法可以用于任何场景中查找第三大数,而不仅仅局限于 LeetCode 难题。