问题分析
小M想要找到往届比赛中排名第三的分数作为目标分数。如果分数中有三个或以上不同的分数,返回其中第三大的分数;如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
解题步骤
-
去重:
-
首先,我们需要去除分数数组中的重复分数。可以使用集合(set)来实现,因为集合会自动去除重复元素。
-
排序:
-
将去重后的分数集合转换为列表,并对其进行降序排序。这样,最大的分数会排在最前面。
3. 判断分数数量:
-
检查排序后的列表中不同分数的数量。
-
如果列表中有三个或更多不同的分数,返回第三大的分数。
-
如果列表中只有两个或更少的不同分数,返回最大的分数。
代码实现
def find_target_score(n, nums):
# Step 1: 去重
unique_scores = set(nums)
# Step 2: 排序
sorted_scores = sorted(unique_scores, reverse=True)
# Step 3: 判断分数数量并返回结果
if len(sorted_scores) >= 3:
# 返回第三大的分数
return sorted_scores[2]
else:
# 返回最大的分数
return sorted_scores[0]
# 测试样例
print(find_target_score(3, [3, 2, 1])) # 输出:1
print(find_target_score(2, [1, 2])) # 输出:2
print(find_target_score(4, [2, 2, 3, 1])) # 输出:1
复杂度分析
-
时间复杂度:
-
去重操作的时间复杂度为 𝑂(𝑛)O(n),其中 𝑛n 是数组的长度。
-
排序操作的时间复杂度为 𝑂(𝑘log𝑘)O(klogk),其中 𝑘k 是去重后不同分数的数量。
-
因此,总的时间复杂度为 𝑂(𝑛+𝑘log𝑘)O(n+klogk)。
-
空间复杂度:
-
使用了一个集合来存储去重后的分数,空间复杂度为 𝑂(𝑘)O(k)。
通过这种方法,我们可以有效地找到小M的目标分数。