游戏排名第三大的分数

92 阅读2分钟

题目分析

给定一个整数 n 和一个列表 nums,我们需要返回以下结果:

  • 如果列表中不同的分数(元素)有 3 个或更多,返回第三大的分数。
  • 如果列表中不同的分数少于 3 个,返回最大的分数。

思路分析

  1. 去重:题目中要求的是"不同的分数",因此我们首先需要去除列表中的重复元素。

  2. 排序:去重后的分数需要排序,目的是为了能准确地找到第三大的元素。

  3. 返回结果

    • 如果排序后的分数列表长度大于或等于 3,我们就返回第三大的分数(即倒数第三个元素)。
    • 如果排序后的分数列表长度小于 3,则返回最大的分数(即倒数第一个元素)。

图解

假设 nums = [3, 2, 1]

  • 去重后:{1, 2, 3}(这时去除了重复的元素)
  • 排序后:[1, 2, 3]
  • 长度为 3,返回第三大的分数 1(即排序后的倒数第三个元素)

假设 nums = [1, 2]

  • 去重后:{1, 2}
  • 排序后:[1, 2]
  • 长度小于 3,返回最大分数 2(即排序后的倒数第一个元素)
  • 代码详解

  1. 去重操作

    pythonCopy Code
    unique_scores = set(nums)
    

    使用 set(nums) 可以去除列表中的重复元素,集合(set)是一个不允许重复元素的无序数据结构。因此,我们不需要担心有重复的分数进入集合。

  2. 排序操作

    pythonCopy Code
    sorted_scores = sorted(unique_scores)
    

    通过 sorted() 函数将去重后的集合转换为列表,并按从小到大的顺序进行排序。

  3. 返回第三大或最大分数

    • 如果 sorted_scores 的长度大于或等于 3,返回倒数第三个元素:

      pythonCopy Code
      return sorted_scores[-3]
      
    • 如果列表长度小于 3,返回倒数第一个元素:

      pythonCopy Code
      return sorted_scores[-1]
      

测试案例

  1. 测试案例 1:

    pythonCopy Code
    print(solution(3, [3, 2, 1]) == 1)
    
    • 去重后:{1, 2, 3}
    • 排序后:[1, 2, 3]
    • 长度为 3,返回倒数第三个元素 1
  2. 测试案例 2:

    pythonCopy Code
    print(solution(2, [1, 2]) == 2)
    
    • 去重后:{1, 2}
    • 排序后:[1, 2]
    • 长度小于 3,返回最大分数 2
  3. 测试案例 3:

    pythonCopy Code
    print(solution(4, [2, 2, 3, 1]) == 1)
    
    • 去重后:{1, 2, 3}
    • 排序后:[1, 2, 3]
    • 长度为 3,返回倒数第三个元素 1

复杂度分析

  • 时间复杂度:O(n log n),主要由排序操作决定,其中 n 是列表 nums 的长度。
  • 空间复杂度:O(n),因为我们使用了一个集合来存储不同的分数,最坏情况下所有分数都不同。

总结

  • 通过去重、排序、判断列表长度,我们能够快速得到第三大的分数或最大分数。
  • 代码实现简单且易于理解,适用于大多数输入数据的场景。