问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到 2000000000000000 级,他想知道有多少英雄有潜力通过历练达到这个等级。
测试样例
样例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级。
-
等级低的英雄不变。
-
-
目标
小U希望至少有一个英雄的等级能达到 2000000000000000 级,问题是:
- 现有的英雄中,有多少个英雄有潜力通过不断历练达到这一目标?
思考
-
潜力英雄的定义:
- 如果一个英雄的初始等级低于其他英雄,并且通过多次历练无法成为“等级最高”的英雄,那么它没有潜力达到目标等级。
- 只有那些初始等级高于某些英雄的英雄,才能通过不断历练,逐渐拉开与低等级英雄的差距,从而有机会达到目标等级。
-
结论:
- 任何英雄,如果它的等级不是最低,就有潜力通过历练达到目标等级。
- 但如果它的初始等级是所有英雄中最低的,始终只能充当“低等级英雄”,无法得到提升。
核心简化
- 找出所有英雄的最低等级。
- 统计比最低等级高的英雄数量。
代码解析
主函数
public static int solution(int n, int[] u) {
// 找到最低等级
int minLevel = Arrays.stream(u).min().orElse(0);
// 统计比最低等级大的英雄数
int count = 0;
for (int level : u) {
if (level > minLevel) {
count++;
}
}
return count;
}
分步解析
- 找出最低等级英雄
int minLevel = Arrays.stream(u).min().orElse(0);
- 使用
Arrays.stream(u).min()找到数组u中最小值,即所有英雄的最低等级。 - 如果数组为空,则返回默认值
0。
- 统计有潜力的英雄
int count = 0;
for (int level : u) {
if (level > minLevel) {
count++;
}
}
- 遍历数组,统计所有等级高于最低等级的英雄。
- 这些英雄都有可能通过历练拉开与低等级英雄的差距,最终达到目标。
- 返回结果
- 最终
count表示有潜力达到目标等级的英雄数量。
测试用例分析
样例一
n = 5;
u = [1, 2, 3, 1, 2];
- 最低等级:
1 - 比1大的英雄:
2,3,2,共3个 - 输出:
3
样例二
n = 4;
u = [100000, 100000, 100000, 100000];
- 最低等级:
100000 - 没有比最低等级还高的英雄
- 输出:
0
样例三
n = 6;
u = [1, 1, 1, 2, 2, 2];
- 最低等级:
1 - 比1大的英雄:
2,2,2,共3个 - 输出:
3
复杂度分析
-
时间复杂度:
- 找到最小值:
O(n)。 - 遍历数组统计:
O(n)。 - 总复杂度:
O(n)。
- 找到最小值:
-
空间复杂度:
- 使用了常量空间,复杂度为
O(1)。
- 使用了常量空间,复杂度为
扩展思路
如果需要进一步优化或扩展,可以考虑以下问题:
- 如果目标等级是动态变化的,如何调整统计策略?
- 如何设计一个算法模拟历练过程,而不仅仅是判断潜力英雄?
总结
这道题本质是模拟游戏中的机制,结合数学规律和代码实现,解决的核心在于识别哪些英雄具备升级潜力。代码清晰简洁,逻辑易于理解,性能优异,非常适合作为算法练习题目。