游戏排名第三的分数

69 阅读3分钟

. 问题背景与目标 在本次编程练习中,我们的目标是帮助小M找到往届游戏比赛中排名第三的分数,作为他的目标分数。具体规则如下: 如果分数中有三个或以上不同的分数,返回其中第三大的分数。 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。 2. 数据结构的选择 在解决这个问题时,我们选择使用Python的set数据结构。set具有以下优点: 自动去重:set会自动去除重复的元素,这符合我们只关心不同分数的需求。 高效查找:set的查找操作平均时间复杂度为O(1),这使得我们在添加和移除元素时非常高效。 3. 算法步骤 初始化set:我们首先创建一个空的set,用于存储唯一的分数。 遍历数组:我们遍历给定的分数数组,将每个分数添加到set中。 维护set大小:在每次添加分数后,我们检查set的大小是否超过3。如果超过,我们移除set中最小的元素,以确保set中始终最多只有三个元素。 返回结果:遍历结束后,如果set的大小为3,我们返回set中最小的元素(即第三大的分数);否则,返回set中最大的元素(即最大的分数)。 4. 代码实现 python def solution(n, nums):    unique_scores = set()    for num in nums:        unique_scores.add        (num)        if len        (unique_scores) > 3:            unique_scores.            remove(min            (unique_scores))    return min    (unique_scores) if len    (unique_scores) == 3     else max(unique_scores)# 测试用例print(solution(3, [3, 2, 1]))  # 输出: 1print(solution(2, [1, 2]))     # 输出: 2print(solution(4, [2, 2, 3, 1]))  # 输出: 1

  1. 代码优化与思考 时间复杂度:当前代码的时间复杂度为O(n),其中n是数组的长度。每次添加和移除操作的时间复杂度为O(1),因此整体性能较好。 空间复杂度:空间复杂度为O(1),因为我们始终只维护一个最多包含3个元素的set。 边界情况:代码已经考虑了边界情况,例如数组中只有两个不同的分数时,会返回最大的分数。
  2. 进一步优化 虽然当前代码已经非常高效,但我们可以考虑进一步优化: 使用堆:如果我们需要处理更大的数据集,可以考虑使用最小堆来维护最大的三个元素。这样可以在O(log k)的时间复杂度内完成插入和删除操作,其中k为堆的大小(这里k=3)。 提前终止:如果数组非常大,我们可以在遍历过程中提前终止,一旦set的大小达到3,就不再添加新的元素。
  3. 总结 通过本次练习,我们学习了如何使用set数据结构来高效地处理唯一元素的问题。我们还了解了如何通过维护set的大小来找到第三大的元素。代码简洁且高效,适合处理中等规模的数据集。通过进一步优化,我们可以应对更大规模的数据处理需求。 希望这篇伴学笔记能帮助你更好地理解代码的实现思路和优化方法。继续加油,编程的路上还有很多有趣的知识等待你去探索!