题目解析
小M想通过查看往届游戏比赛的排名来确定自己的目标分数。目标是通过给定的分数列表,计算出第三大的分数,或者选择最大的分数作为目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,则返回最大的分数。
输入:
n:表示分数的数量。nums:一个包含n个整数的列表,代表所有的分数。
输出:
- 返回小M的目标分数,符合规则。
思路分析
这个问题的关键是如何根据不同的分数数量来决定返回的分数。具体的解决方案可以分为以下几步:
-
去重:首先,我们需要确保考虑的分数是唯一的,因为如果分数列表中有重复的分数,我们只能算作一个不同的分数。
-
排序:将去重后的分数从小到大排序,方便我们从中选择第三大分数或者最大分数。
-
判断条件:
- 如果去重后的分数数量大于或等于 3,则返回第三大的分数(即排序后的倒数第三个元素)。
- 如果去重后的分数数量小于 3,则返回最大的分数(即排序后的最后一个元素)。
具体步骤
-
去重:使用
set(nums)来去除重复的分数,因为集合(set)自动去重。 -
排序:将去重后的分数排序,使用
sorted()函数。 -
判断条件:根据去重后的列表长度判断是否有足够的不同分数:
- 如果有 3 个或更多的不同分数,返回倒数第三个分数。
- 如果有 2 个或更少的不同分数,返回最大的分数。
代码实现
def solution(n: int, nums: list) -> int:
# 去重并排序
unique_scores = sorted(set(nums))
# 如果有3个或更多不同的分数,返回第三大的分数
if len(unique_scores) >= 3:
return unique_scores[-3]
# 否则返回最大的分数
return unique_scores[-1]
# 测试样例
if __name__ == '__main__':
# 第三大的分数是 1
print(solution(3, [3, 2, 1]) == 1)
# 只有两个不同分数,返回最大的 2
print(solution(2, [1, 2]) == 2)
# 第三大的分数是 1
print(solution(4, [2, 2, 3, 1]) == 1)
代码详解
-
去重排序:
unique_scores = sorted(set(nums))set(nums):去除nums中的重复分数。sorted(set(nums)):对去重后的分数进行排序,得到从小到大的顺序。
-
判断条件:
if len(unique_scores) >= 3: return unique_scores[-3] return unique_scores[-1]- 如果去重后的分数数量
len(unique_scores)大于或等于 3,那么返回倒数第三个元素unique_scores[-3]。 - 否则,返回最大的分数
unique_scores[-1]。
- 如果去重后的分数数量
时间复杂度
- 去重操作:
set(nums)的时间复杂度是 O(n),其中 n 是分数列表的长度。 - 排序操作:
sorted()函数的时间复杂度是 O(k log k),其中 k 是去重后列表的长度,最多为 n,因此排序的复杂度为 O(n log n)。 - 总时间复杂度:O(n log n),因为排序是主导复杂度。
空间复杂度
- 使用了额外的集合
set(nums)和排序后的列表unique_scores,所以空间复杂度为 O(n),其中 n 是分数列表的长度。