AI 刷题 34. 游戏排名第三大的分数 题解 | 豆包MarsCode AI刷题

103 阅读2分钟

问题分析

小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的目标分数。