问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
题目分析
最低等级的英雄无法从其他英雄的历练中提升,而其他等级均可以与更低等级的英雄历练(田忌赛马)。
故答案为最低等级的英雄数量。
解题思路
-
排序
-
计算最低等级英雄数量
代码实现
import java.util.Arrays;
public class Main {
public static int solution(int n, int[] u) {
// 按等级排序
Arrays.sort(u);
// 若所有英雄等级相同,则没有英雄具备潜力
if (u[0] == u[u.length - 1]) {
return 0;
}
// 统计最低等级英雄的数量
int count = 0;
int minLevel = u[0];
for (int level : u) {
if (level == minLevel) {
count++;
} else {
break; // 一旦遇到非最低等级英雄,停止计数
}
}
// 有潜力的英雄数量 = 总英雄数量 - 最低等级英雄数量
return n - count;
}
public static void main(String[] args) {
// 示例测试
System.out.println(solution(5, new int[]{1, 2, 3, 1, 2}) == 3); // 示例1
System.out.println(solution(4, new int[]{100000, 100000, 100000, 100000}) == 0); // 示例2
System.out.println(solution(6, new int[]{1, 1, 1, 2, 2, 2}) == 3); // 示例3
}
}
复杂度分析
- 时间复杂度:
- 数组排序需要
O(nlog n)。 - 遍历数组统计最低等级英雄数量需要
O(n)。 - 总复杂度为
O(nlog n)。
- 数组排序需要
- 空间复杂度:
- 排序操作为原地排序,空间复杂度为
O(1)。
- 排序操作为原地排序,空间复杂度为
边界条件
- 如果所有英雄等级相同,则结果为
0,因为没有英雄能达到目标等级。