题目解析(六)| 豆包MarsCode AI刷题

115 阅读3分钟

题目解析

题目描述
小U在一款挂机游戏中有 n 个英雄。每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级不会改变。如果英雄等级不同,等级较高的英雄会增加1级,而等级较低的英雄则保持不变。小U希望至少有一个英雄能够达到 2000000000000000 级,要求计算有多少英雄有潜力通过历练达到这个等级。

image.png

问题分析

  1. 每次进行历练时,两个等级不同的英雄将使等级较高的英雄升1级。
  2. 如果一个英雄的等级是 max_level,则它无法通过历练进一步提升自己的等级,因此只有等级小于 max_level 的英雄才有潜力通过历练达到 max_level
  3. 我们需要找出所有英雄中有潜力通过历练达到最大等级 max_level 的英雄数量,即那些比最大等级小的英雄。

解决思路

  1. 统计等级分布:首先,我们可以通过一个字典统计每个英雄等级的数量。
  2. 计算最大等级:找出当前所有英雄中的最大等级。
  3. 潜力英雄计算:计算那些等级小于最大等级的英雄数量,这些英雄有潜力通过历练达到最大等级。

代码实现

def solution(n: int, u: list) -> int:
    # 统计每个等级的英雄数量
    level_count = {}
    for level in u:
        if level in level_count:
            level_count[level] += 1
        else:
            level_count[level] = 1
    
    # 找出最高等级
    max_level = max(level_count.keys())
    
    # 计算潜力英雄数量,即等级小于max_level的英雄数量
    potential_heroes = 0
    for level, count in level_count.items():
        if level < max_level:
            potential_heroes += count
    
    return potential_heroes

代码解释

  1. 统计等级分布

    • 使用 level_count 字典统计每个英雄等级的出现次数。
  2. 找出最大等级

    • 使用 max(level_count.keys()) 获取所有英雄中的最大等级。
  3. 计算潜力英雄数量

    • 遍历 level_count 字典,对于所有等级小于最大等级的英雄,将其数量加到 potential_heroes 变量中,最终得到有潜力达到最大等级的英雄数。

时间复杂度分析

  • 时间复杂度O(n),其中 n 是英雄数量。我们需要遍历一次英雄列表来统计等级数量,然后遍历 level_count 字典来计算潜力英雄的数量。两者的时间复杂度均为线性,因此总时间复杂度为 O(n)
  • 空间复杂度O(n),用于存储 level_count 字典,最多需要 n 个不同的等级。

边界情况

  1. 所有英雄等级相同:如果所有英雄的等级都相同,则没有英雄能够通过历练提升自己的等级,因此返回 0
  2. 最小输入:如果 n = 1,即只有一个英雄,返回 0,因为该英雄没有其他英雄可进行历练。
  3. 最大等级在最前面或最后面:如果最大等级的英雄出现在列表的前面或后面,代码依然能正确工作,因为我们始终找到最大等级并计算其余等级小于它的英雄数。

示例分析

示例1
输入:
n = 5, u = [1, 2, 3, 1, 2]

输出:
3

解释:

  • 最大等级是 3,有潜力通过历练达到 3 的英雄是等级为 12 的英雄,共有 3 个英雄。

示例2
输入:
n = 4, u = [100000, 100000, 100000, 100000]

输出:
0

解释:

  • 所有英雄的等级都相同,因此没有英雄可以通过历练提高等级,结果为 0

示例3
输入:
n = 6, u = [1, 1, 1, 2, 2, 2]

输出:
3

解释:

  • 最大等级是 2,有潜力通过历练达到 2 的英雄是等级为 1 的英雄,共有 3 个英雄。

通过这段代码,我们能够有效地计算出有潜力通过历练达到最大等级的英雄数量。