题目分析
给定一个整数 n 和一个列表 nums,我们需要返回以下结果:
- 如果列表中不同的分数(元素)有 3 个或更多,返回第三大的分数。
- 如果列表中不同的分数少于 3 个,返回最大的分数。
思路分析
-
去重:题目中要求的是"不同的分数",因此我们首先需要去除列表中的重复元素。
-
排序:去重后的分数需要排序,目的是为了能准确地找到第三大的元素。
-
返回结果:
- 如果排序后的分数列表长度大于或等于 3,我们就返回第三大的分数(即倒数第三个元素)。
- 如果排序后的分数列表长度小于 3,则返回最大的分数(即倒数第一个元素)。
图解
假设 nums = [3, 2, 1]:
- 去重后:
{1, 2, 3}(这时去除了重复的元素) - 排序后:
[1, 2, 3] - 长度为 3,返回第三大的分数
1(即排序后的倒数第三个元素)
假设 nums = [1, 2]:
- 去重后:
{1, 2} - 排序后:
[1, 2] - 长度小于 3,返回最大分数
2(即排序后的倒数第一个元素) -
代码详解
-
去重操作:
pythonCopy Code unique_scores = set(nums)使用
set(nums)可以去除列表中的重复元素,集合(set)是一个不允许重复元素的无序数据结构。因此,我们不需要担心有重复的分数进入集合。 -
排序操作:
pythonCopy Code sorted_scores = sorted(unique_scores)通过
sorted()函数将去重后的集合转换为列表,并按从小到大的顺序进行排序。 -
返回第三大或最大分数:
-
如果
sorted_scores的长度大于或等于 3,返回倒数第三个元素:pythonCopy Code return sorted_scores[-3] -
如果列表长度小于 3,返回倒数第一个元素:
pythonCopy Code return sorted_scores[-1]
-
测试案例
-
测试案例 1:
pythonCopy Code print(solution(3, [3, 2, 1]) == 1)- 去重后:
{1, 2, 3} - 排序后:
[1, 2, 3] - 长度为 3,返回倒数第三个元素
1。
- 去重后:
-
测试案例 2:
pythonCopy Code print(solution(2, [1, 2]) == 2)- 去重后:
{1, 2} - 排序后:
[1, 2] - 长度小于 3,返回最大分数
2。
- 去重后:
-
测试案例 3:
pythonCopy Code print(solution(4, [2, 2, 3, 1]) == 1)- 去重后:
{1, 2, 3} - 排序后:
[1, 2, 3] - 长度为 3,返回倒数第三个元素
1。
- 去重后:
复杂度分析
- 时间复杂度:
O(n log n),主要由排序操作决定,其中n是列表nums的长度。 - 空间复杂度:
O(n),因为我们使用了一个集合来存储不同的分数,最坏情况下所有分数都不同。
总结
- 通过去重、排序、判断列表长度,我们能够快速得到第三大的分数或最大分数。
- 代码实现简单且易于理解,适用于大多数输入数据的场景。