使用 Python 解题 - 游戏英雄升级潜力评估

92 阅读3分钟

一,题目详情

1,问题描述

小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。

小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。

2,测试样例

样例1:

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

输出:3

样例2:

输入:n = 4 ,u = [100000, 100000, 100000, 100000]

输出:0

样例3:

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

输出:3

b56474d3096d69cb496196418417687.png

二,解题思路

1,问题分析

我们需要找出有多少英雄可以通过历练达到2000000000000000级。根据升级规则,只有那些初始等级高于数组中最小等级的英雄才有潜力不断提升,最终达到目标。

2,算法策略

核心思想是:统计初始等级大于数组最小值的英雄数量。因为这些英雄可以通过不断与低等级英雄配对来提升自己,而低等级英雄无法通过任何方式提升。

具体步骤如下:

  1. 找出数组中的最小值。
  2. 统计数组中大于最小值的元素个数。

3,逐步推演(以样例1为例)

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

最小值是1,数组中有3个元素大于1(2, 3, 2),所以输出3。

三,代码实现

Python复制

def solution(n: int, u: list) -> int:
    min_level = min(u)
    count = 0
    for level in u:
        if level > min_level:
            count += 1
    return count

1,复杂度分析

  • 时间复杂度:O(n)

    • 遍历数组两次,一次找最小值,一次统计
  • 空间复杂度:O(1)

    • 仅使用常数级额外空间

2,边界测试

Python复制

if __name__ == '__main__':
    # 常规测试
    print(solution(n = 5, u = [1, 2, 3, 1, 2]) == 3)
    print(solution(n = 4, u = [100000, 100000, 100000, 100000]) == 0)
    print(solution(n = 6, u = [1, 1, 1, 2, 2, 2]) == 3)

    # 边界测试:所有元素相同
    print(solution(n = 3, u = [5, 5, 5]) == 0)

    # 边界测试:只有一个元素
    print(solution(n = 1, u = [100]) == 0)

四,总结

通过统计大于最小值的元素个数,我们实现了:

  1. 快速判断有潜力的英雄数量:基于简单的遍历和比较
  2. 高效的计算:线性时间复杂度
  3. 普适性:适用于所有英雄等级数组

这种解法不仅高效,还易于理解和实现。当遇到“需要根据初始条件判断潜力”类问题时,找到关键的比较基准往往是解决问题的关键策略。

b29d7f78f64a49702aac75233ece6d6.png