原程序代码 这个程序主要用于解决游戏排名中寻找第三大分数的问题。在初始版本中,我们采用了直接的集合和排序方法来实现功能。
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)
代码解读
- 输入处理:接收比赛人数n和分数数组nums作为输入参数。
- 去重操作:使用set()将数组转换为集合,去除重复分数。
- 排序处理:将去重后的集合转换回列表并降序排序。
- 条件判断:根据不同分数的数量,返回相应的目标分数。
优化思路 虽然当前解决方案能够正确处理问题,但我们可以从以下几个方面进行优化:
步骤 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)。
- 代码可维护性:虽然代码行数略有增加,但逻辑更清晰,易于理解和维护。
总结
- 原始解法虽然直观,但在性能上存在优化空间。
- 通过维护三个变量的方式,我们避免了额外的空间开销和排序操作。
- 优化后的解法在处理大规模数据时会有明显的性能提升。
这个问题展示了如何通过算法优化来提升程序性能,同时保持代码的可读性和可维护性。在实际开发中,我们需要根据具体场景在性能和可读性之间找到平衡点。