题目解析 27. 游戏英雄升级潜力评估 | 豆包MarsCode AI刷题

102 阅读2分钟

感觉这应该是一道简单题。。。

在这个问题中,英雄通过每天选择两位进行历练的方式来提升等级。如果两位英雄的等级相同,则两者均保持不变;如果等级不同,则等级较高的英雄提升1级,等级较低的英雄不变。目标是确定在所有的英雄中,有多少英雄有潜力通过这种机制达到一个极高的等级,即 2000000000000000。

问题的核心在于分析不同英雄的等级关系,尤其是最低等级的英雄。具体地,我们需要推导哪些英雄有机会在不断的历练中成长到目标等级。

关键点:

  1. 最低等级的英雄无法成长

    • 如果一个英雄的初始等级是所有英雄中最低的,且无论与哪一个英雄搭配进行历练,其等级都不会变化(因为它总是“等级较低的英雄”)。
    • 因此,最低等级的英雄在整个过程中始终保持原级,永远不可能达到目标等级。
  2. 非最低等级的英雄有成长潜力

    • 所有其他等级的英雄,只要有比自己等级更低的英雄存在,就有机会通过多次历练成长到更高的等级。
    • 因此,只需统计初始等级中不是最低等级的英雄数量即可。

基于上述观察,我们可以将问题简化为一个计数问题:

  1. 找到初始等级数组中的最低值。
  2. 统计初始等级中等于最低值的英雄个数。
  3. 总英雄数减去最低等级英雄数,得到有潜力达到目标等级的英雄数。

该方法的算法步骤如下:

  1. 使用 min(u) 找到最低等级。
  2. 使用 u.count(min(u)) 统计最低等级英雄数。
  3. 返回 n−count(min(u))。

代码如下:

def solution(n: int, u: list) -> int:
    min_value = min(u)
    count_min = u.count(min_value)
    return n - count_min

只有三行。只要稍加思索就能得出结论,所以感觉是简单题……

进一步思考:

  1. 极大目标等级的处理

    • 2000000000000000 是一个极大值,但并不影响解题过程,因为只要能成长,目标等级的大小对结论没有实际影响。
  2. 优化扩展

    • 如果输入数据的规模非常大(例如 n > 10^7),需要特别优化计数过程。例如,可以结合直方图统计最低等级出现次数,而不必遍历两次数组。
  3. 特殊情况

    • 如果所有英雄的等级都相同,则结果总是 0。
    • 如果只有一个英雄,则结果也是 0,因为无法进行历练。