游戏排名第三大的分数

94 阅读3分钟

从给定的分数列表中找到排名第三大的分数,或者在不同分数少于三个的情况下,选择最大的分数作为目标。

问题描述

小M想通过查看往届比赛的排名来确定自己的目标分数。他需要确定的是:

  1. 如果比赛分数中有三个或以上不同的分数,那么返回其中第三大的分数。
  2. 如果不同的分数少于三个,那么返回分数中最大的分数。

例如,给定以下的分数数组:

  • 输入:[3, 2, 1] 输出:1
  • 输入:[1, 2] 输出:2
  • 输入:[2, 2, 3, 1] 输出:1

解决思路

要解决这个问题,我们可以按以下步骤进行:

  1. 去重:首先,我们需要去除重复的分数,因为我们关心的是不同的分数。可以使用 set 来去重。

  2. 排序:去重后,我们将这些不同的分数排序,从大到小排列。

  3. 判断数量

    • 如果排序后的不同分数大于或等于 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]  # 返回最大的分数

代码解析

  1. 去重操作unique_scores = set(nums) 这一行将 nums 列表转化为集合,从而自动去除了重复的分数。

  2. 排序操作sorted_scores = sorted(unique_scores, reverse=True) 将去重后的分数从大到小进行排序。reverse=True 参数确保列表按降序排列。

  3. 判断并返回结果

    • 如果不同分数的数量大于或等于 3(len(sorted_scores) >= 3),我们返回排序后的第三个元素 sorted_scores[2]
    • 如果不同分数的数量小于 3,我们返回最大分数 sorted_scores[0]

测试案例

让我们通过几个测试用例来验证这个函数的正确性。

  1. 测试用例 1

    • 输入:n = 3, nums = [3, 2, 1]
    • 输出:1
    • 解释:去重后的分数为 [3, 2, 1],排序后为 [3, 2, 1],第三大的分数是 1
  2. 测试用例 2

    • 输入:n = 2, nums = [1, 2]
    • 输出:2
    • 解释:去重后的分数为 [1, 2],排序后为 [2, 1],由于不同分数不足三个,我们返回最大的分数 2
  3. 测试用例 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(m),其中 m 是去重后的分数数量。最坏情况下,m 等于 n,因此空间复杂度为 O(n)。

总结

通过这篇文章,我们介绍了如何编写一个 Python 函数来解决小M的游戏排名问题。函数通过去重、排序和条件判断来找出目标分数。这个方法简洁且高效,适用于一般的分数排序问题。如果你在实际应用中需要处理类似的排名问题,可以参考并改进这个方案。