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

164 阅读2分钟

原程序代码 这个程序主要用于解决游戏排名中寻找第三大分数的问题。在初始版本中,我们采用了直接的集合和排序方法来实现功能。

def solution(n: int, nums: list) -> int:
    # 创建集合去除重复分数
    unique_nums = set(nums)
    # 转换为列表并降序排序
    sorted_nums = sorted(list(unique_nums), reverse=True)
    
    # 如果不同分数大于等于3个,返回第三大的分数
    if len(sorted_nums) >= 3:
        return sorted_nums[2]
    # 如果不同分数少于3个,返回最大分数
    else:
        return sorted_nums[0]

if __name__ == '__main__':
    print(solution(3, [3, 2, 1]) == 1)
    print(solution(2, [1, 2]) == 2)
    print(solution(4, [2, 2, 3, 1]) == 1)

代码解读

  1. 输入处理:接收比赛人数n和分数数组nums作为输入参数。
  2. 去重操作:使用set()将数组转换为集合,去除重复分数。
  3. 排序处理:将去重后的集合转换回列表并降序排序。
  4. 条件判断:根据不同分数的数量,返回相应的目标分数。

优化思路 虽然当前解决方案能够正确处理问题,但我们可以从以下几个方面进行优化:

步骤 1: 空间优化 当前方案中,我们创建了额外的数据结构(集合和排序列表)。对于大规模数据,这可能会占用较多内存。

步骤 2: 时间复杂度分析 目前的时间复杂度是O(nlogn),主要来自排序操作。我们可以通过使用堆结构或维护三个变量来优化。

优化后的代码

def solution(n: int, nums: list) -> int:
    # 初始化三个最大值变量
    first = float('-inf')
    second = float('-inf')
    third = float('-inf')
    
    # 单次遍历更新三个最大值
    for num in nums:
        if num > first:
            third = second
            second = first
            first = num
        elif num < first and num > second:
            third = second
            second = num
        elif num < second and num > third:
            third = num
    
    # 判断是否存在第三大的数
    return third if third != float('-inf') else first

if __name__ == '__main__':
    print(solution(3, [3, 2, 1]) == 1)
    print(solution(2, [1, 2]) == 2)
    print(solution(4, [2, 2, 3, 1]) == 1)

优化效果分析

  • 空间复杂度:优化后的代码只使用了三个变量,空间复杂度从O(n)降低到O(1)。
  • 时间复杂度:通过单次遍历完成计算,时间复杂度从O(nlogn)降低到O(n)。
  • 代码可维护性:虽然代码行数略有增加,但逻辑更清晰,易于理解和维护。

总结

  1. 原始解法虽然直观,但在性能上存在优化空间。
  2. 通过维护三个变量的方式,我们避免了额外的空间开销和排序操作。
  3. 优化后的解法在处理大规模数据时会有明显的性能提升。

这个问题展示了如何通过算法优化来提升程序性能,同时保持代码的可读性和可维护性。在实际开发中,我们需要根据具体场景在性能和可读性之间找到平衡点。