一,题目详情
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
二,解题思路
1,问题分析
我们需要找出有多少英雄可以通过历练达到2000000000000000级。根据升级规则,只有那些初始等级高于数组中最小等级的英雄才有潜力不断提升,最终达到目标。
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)
四,总结
通过统计大于最小值的元素个数,我们实现了:
- 快速判断有潜力的英雄数量:基于简单的遍历和比较
- 高效的计算:线性时间复杂度
- 普适性:适用于所有英雄等级数组
这种解法不仅高效,还易于理解和实现。当遇到“需要根据初始条件判断潜力”类问题时,找到关键的比较基准往往是解决问题的关键策略。