解决这类问题的核心是:对分数列表进行去重和排序,然后判断不同分数的数量,最终返回相应的值。
步骤解析
-
去重:
- 使用
set(nums)将列表中的重复分数去掉,只保留不同的分数。
- 使用
-
排序:
- 将去重后的分数列表进行降序排列,使得最大值出现在第一位,第三大的分数出现在第三位。
- 可以使用
sorted(..., reverse=True)实现降序排列。
-
判断不同分数的数量:
- 如果去重后分数的数量少于3个(即列表长度小于3),直接返回最大的分数,即排序列表的第一个元素。
- 否则,返回排序列表的第三个元素。
-
边界处理:
- 输入分数列表为空,返回需要特别处理。
- 输入分数中有重复值或负数时,代码逻辑不受影响。
# 去重并排序(降序)
unique_scores = sorted(set(nums), reverse=True)
# 如果不同分数少于3个,返回最大值
if len(unique_scores) < 3:
return unique_scores[0]
# 否则返回第三大的分数
return unique_scores[2]
# 测试用例
if __name__ == '__main__':
print(solution(3, [3, 2, 1]) == 1) # 测试用例 1
print(solution(2, [1, 2]) == 2) # 测试用例 2
print(solution(4, [2, 2, 3, 1]) == 1) # 测试用例 3
print(solution(5, [1, 1, 1, 1, 1]) == 1) # 边界测试,所有分数相同
print(solution(0, []) == None) # 边界测试,空列表
样例详解
样例1
输入:n = 3, nums = [3, 2, 1]
- 去重后:
{3, 2, 1}。 - 排序后(降序):
[3, 2, 1]。 - 不同分数大于等于3,返回第三大的分数:
1。
输出:1
样例2
输入:n = 2, nums = [1, 2]
- 去重后:
{1, 2}。 - 排序后(降序):
[2, 1]。 - 不同分数少于3个,返回最大值:
2。
输出:2
样例3
输入:n = 4, nums = [2, 2, 3, 1]
- 去重后:
{1, 2, 3}。 - 排序后(降序):
[3, 2, 1]。 - 不同分数大于等于3,返回第三大的分数:
1。
输出:1
边界情况分析
-
所有分数相同:
- 输入:
nums = [1, 1, 1, 1, 1] - 去重后:
{1}。 - 排序后:
[1]。 - 由于只有一个分数,直接返回最大值:
1。
- 输入:
-
输入为空:
- 输入:
nums = [] - 返回值需要特殊处理。可以通过添加判断
if not nums: return None。
- 输入:
-
负数情况:
- 输入:
nums = [-1, -2, -3] - 去重后:
{-1, -2, -3}。 - 排序后:
[-1, -2, -3]。 - 返回第三大的分数:
-3。
- 输入:
时间复杂度分析
-
去重:
set(nums)的时间复杂度为 O(n)O(n),其中 nn 是数组的长度。
-
排序:
- 对去重后的数组排序,时间复杂度为 O(klogk)O(klogk),其中 kk 是去重后数组的长度,显然 k≤nk≤n。
-
总体复杂度:
- 总复杂度为 O(n+klogk)O(n+klogk),由于 kk 通常较小,近似为 O(n)O(n)。
总结
-
核心知识点:
- 使用
set去重。 - 使用
sorted进行降序排列。 - 灵活处理边界情况(如分数少于3个)。
- 使用
-
优势:
- 代码简洁,处理多种场景。
- 时间复杂度低,适合大规模数据。
-
可扩展性:
- 如果需要找第 kk 大分数,可以扩展到任意 kk 的场景。
- 适合拓展到比赛数据分析等实际应用。