题目解析
题目描述
小U在一款挂机游戏中有 n 个英雄。每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级不会改变。如果英雄等级不同,等级较高的英雄会增加1级,而等级较低的英雄则保持不变。小U希望至少有一个英雄能够达到 2000000000000000 级,要求计算有多少英雄有潜力通过历练达到这个等级。
问题分析
- 每次进行历练时,两个等级不同的英雄将使等级较高的英雄升1级。
- 如果一个英雄的等级是
max_level,则它无法通过历练进一步提升自己的等级,因此只有等级小于max_level的英雄才有潜力通过历练达到max_level。 - 我们需要找出所有英雄中有潜力通过历练达到最大等级
max_level的英雄数量,即那些比最大等级小的英雄。
解决思路
- 统计等级分布:首先,我们可以通过一个字典统计每个英雄等级的数量。
- 计算最大等级:找出当前所有英雄中的最大等级。
- 潜力英雄计算:计算那些等级小于最大等级的英雄数量,这些英雄有潜力通过历练达到最大等级。
代码实现
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
代码解释
-
统计等级分布:
- 使用
level_count字典统计每个英雄等级的出现次数。
- 使用
-
找出最大等级:
- 使用
max(level_count.keys())获取所有英雄中的最大等级。
- 使用
-
计算潜力英雄数量:
- 遍历
level_count字典,对于所有等级小于最大等级的英雄,将其数量加到potential_heroes变量中,最终得到有潜力达到最大等级的英雄数。
- 遍历
时间复杂度分析
- 时间复杂度:
O(n),其中n是英雄数量。我们需要遍历一次英雄列表来统计等级数量,然后遍历level_count字典来计算潜力英雄的数量。两者的时间复杂度均为线性,因此总时间复杂度为O(n)。 - 空间复杂度:
O(n),用于存储level_count字典,最多需要n个不同的等级。
边界情况
- 所有英雄等级相同:如果所有英雄的等级都相同,则没有英雄能够通过历练提升自己的等级,因此返回
0。 - 最小输入:如果
n = 1,即只有一个英雄,返回0,因为该英雄没有其他英雄可进行历练。 - 最大等级在最前面或最后面:如果最大等级的英雄出现在列表的前面或后面,代码依然能正确工作,因为我们始终找到最大等级并计算其余等级小于它的英雄数。
示例分析
示例1
输入:
n = 5, u = [1, 2, 3, 1, 2]
输出:
3
解释:
- 最大等级是
3,有潜力通过历练达到3的英雄是等级为1和2的英雄,共有 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 个英雄。
通过这段代码,我们能够有效地计算出有潜力通过历练达到最大等级的英雄数量。