从给定的分数列表中找到排名第三大的分数,或者在不同分数少于三个的情况下,选择最大的分数作为目标。
问题描述
小M想通过查看往届比赛的排名来确定自己的目标分数。他需要确定的是:
- 如果比赛分数中有三个或以上不同的分数,那么返回其中第三大的分数。
- 如果不同的分数少于三个,那么返回分数中最大的分数。
例如,给定以下的分数数组:
- 输入:[3, 2, 1] 输出:1
- 输入:[1, 2] 输出:2
- 输入:[2, 2, 3, 1] 输出:1
解决思路
要解决这个问题,我们可以按以下步骤进行:
-
去重:首先,我们需要去除重复的分数,因为我们关心的是不同的分数。可以使用
set来去重。 -
排序:去重后,我们将这些不同的分数排序,从大到小排列。
-
判断数量:
- 如果排序后的不同分数大于或等于 3,我们返回第三大的分数(也就是排序后的第三个元素)。
- 如果排序后的不同分数少于 3,我们返回最大的分数(排序后的第一个元素)。
Python 实现
def solution(n: int, nums: list) -> int:
# 去重并转换为集合
unique_scores = set(nums)
# 将去重后的分数列表进行排序,从大到小
sorted_scores = sorted(unique_scores, reverse=True)
# 判断不同分数的数量
if len(sorted_scores) >= 3:
return sorted_scores[2] # 返回第三大的分数
else:
return sorted_scores[0] # 返回最大的分数
代码解析
-
去重操作:
unique_scores = set(nums)这一行将nums列表转化为集合,从而自动去除了重复的分数。 -
排序操作:
sorted_scores = sorted(unique_scores, reverse=True)将去重后的分数从大到小进行排序。reverse=True参数确保列表按降序排列。 -
判断并返回结果:
- 如果不同分数的数量大于或等于 3(
len(sorted_scores) >= 3),我们返回排序后的第三个元素sorted_scores[2]。 - 如果不同分数的数量小于 3,我们返回最大分数
sorted_scores[0]。
- 如果不同分数的数量大于或等于 3(
测试案例
让我们通过几个测试用例来验证这个函数的正确性。
-
测试用例 1
- 输入:
n = 3, nums = [3, 2, 1] - 输出:
1 - 解释:去重后的分数为
[3, 2, 1],排序后为[3, 2, 1],第三大的分数是1。
- 输入:
-
测试用例 2
- 输入:
n = 2, nums = [1, 2] - 输出:
2 - 解释:去重后的分数为
[1, 2],排序后为[2, 1],由于不同分数不足三个,我们返回最大的分数2。
- 输入:
-
测试用例 3
- 输入:
n = 4, nums = [2, 2, 3, 1] - 输出:
1 - 解释:去重后的分数为
[1, 2, 3],排序后为[3, 2, 1],第三大的分数是1。
- 输入:
复杂度分析
-
时间复杂度:
- 转换为集合的时间复杂度是 O(n),其中 n 是
nums列表的长度。 - 对集合进行排序的时间复杂度是 O(m log m),其中 m 是去重后的分数数量。最坏情况下,m 等于 n,因此排序的时间复杂度是 O(n log n)。
- 整体的时间复杂度为 O(n log n)。
- 转换为集合的时间复杂度是 O(n),其中 n 是
-
空间复杂度:
- 我们使用了一个集合来去重,空间复杂度为 O(m),其中 m 是去重后的分数数量。最坏情况下,m 等于 n,因此空间复杂度为 O(n)。
总结
通过这篇文章,我们介绍了如何编写一个 Python 函数来解决小M的游戏排名问题。函数通过去重、排序和条件判断来找出目标分数。这个方法简洁且高效,适用于一般的分数排序问题。如果你在实际应用中需要处理类似的排名问题,可以参考并改进这个方案。