感觉这应该是一道简单题。。。
在这个问题中,英雄通过每天选择两位进行历练的方式来提升等级。如果两位英雄的等级相同,则两者均保持不变;如果等级不同,则等级较高的英雄提升1级,等级较低的英雄不变。目标是确定在所有的英雄中,有多少英雄有潜力通过这种机制达到一个极高的等级,即 2000000000000000。
问题的核心在于分析不同英雄的等级关系,尤其是最低等级的英雄。具体地,我们需要推导哪些英雄有机会在不断的历练中成长到目标等级。
关键点:
-
最低等级的英雄无法成长
- 如果一个英雄的初始等级是所有英雄中最低的,且无论与哪一个英雄搭配进行历练,其等级都不会变化(因为它总是“等级较低的英雄”)。
- 因此,最低等级的英雄在整个过程中始终保持原级,永远不可能达到目标等级。
-
非最低等级的英雄有成长潜力
- 所有其他等级的英雄,只要有比自己等级更低的英雄存在,就有机会通过多次历练成长到更高的等级。
- 因此,只需统计初始等级中不是最低等级的英雄数量即可。
基于上述观察,我们可以将问题简化为一个计数问题:
- 找到初始等级数组中的最低值。
- 统计初始等级中等于最低值的英雄个数。
- 总英雄数减去最低等级英雄数,得到有潜力达到目标等级的英雄数。
该方法的算法步骤如下:
- 使用 min(u) 找到最低等级。
- 使用 u.count(min(u)) 统计最低等级英雄数。
- 返回 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
只有三行。只要稍加思索就能得出结论,所以感觉是简单题……
进一步思考:
-
极大目标等级的处理
- 2000000000000000 是一个极大值,但并不影响解题过程,因为只要能成长,目标等级的大小对结论没有实际影响。
-
优化扩展
- 如果输入数据的规模非常大(例如 n > 10^7),需要特别优化计数过程。例如,可以结合直方图统计最低等级出现次数,而不必遍历两次数组。
-
特殊情况
- 如果所有英雄的等级都相同,则结果总是 0。
- 如果只有一个英雄,则结果也是 0,因为无法进行历练。