返回
探索 LeetCode 第 414 题:寻觅第三大的数
见解分享
2024-01-24 08:42:44
LeetCode 第 414 题:第三大的数
导言
LeetCode 是一个备受青睐的在线编程竞赛平台,提供了一系列编程难题,难度不等,供用户练习和磨练。第 414 题“第三大的数”属于中等难度,是对我们数组处理和排序能力的考验。本文将深入探讨此难题,介绍其定义、解决思路,并提供 Python 和 Java 语言的实现。
问题定义
给定一个非空的整数数组 nums
,其中可能存在重复元素,要求找出数组中第三大的数。倘若数组中不存在第三大的数,则返回数组中最大的数。
解决思路
解决此难题的关键在于透彻理解题目要求:寻找第三大的数。我们可采用以下步骤:
- 排序数组: 首先,按照降序对数组
nums
进行排序。排序后,第三大的数将位于索引 2 处(如果存在)。 - 验证数组长度: 如果数组长度不足 3,则不存在第三大的数。在这种情况下,返回数组中的最大值(索引 0 处)。
- 元素比较: 比较索引 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 语言的实现示例,帮助您全面理解并掌握此题的解决方法。
常见问题解答
-
如果数组中存在多个第三大的数,该怎么办?
- 我们的算法将返回第一个找到的第三大数。
-
如果数组中包含大量重复的元素,会影响算法的性能吗?
- 由于数组在排序前会删除重复元素,因此不会影响算法的性能。
-
算法是否可以用于查找数组中的第四大或更大数?
- 算法可以轻松修改为查找第 k 大的数,只需修改代码中的一些逻辑即可。
-
排序数组时,是否可以使用其他排序算法?
- 可以,但快速排序通常是数组排序的最佳选择。
-
算法是否可以用作一般情况下的第三大数查找工具?
- 是的,算法可以用于任何场景中查找第三大数,而不仅仅局限于 LeetCode 难题。