问题描述
小U在一款挂机游戏中拥有 n 个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到 2000000000000000 级,他想知道有多少英雄有潜力通过历练达到这个等级。
输入输出
-
输入:
n:英雄的数量。u:一个包含n个整数的数组,表示每个英雄的初始等级。
-
输出:
- 一个整数,表示有多少英雄有潜力通过历练达到
2000000000000000级。
- 一个整数,表示有多少英雄有潜力通过历练达到
测试样例
-
样例1:
- 输入:
n = 5, u = [1, 2, 3, 1, 2] - 输出:
3 - 解释:等级为
3的英雄可以通过历练达到2000000000000000级。
- 输入:
-
样例2:
- 输入:
n = 4, u = [100000, 100000, 100000, 100000] - 输出:
0 - 解释:所有英雄的等级相同,无法通过历练提升等级。
- 输入:
-
样例3:
- 输入:
n = 6, u = [1, 1, 1, 2, 2, 2] - 输出:
3 - 解释:等级为
2的英雄可以通过历练达到2000000000000000级。
- 输入:
思路解析
1. 排序
首先,我们可以对 u 数组进行排序。排序后,等级较高的英雄会出现在数组的末尾。
2. 遍历查找
从数组的末尾开始遍历,找到第一个等级与数组中最小等级相同的英雄。所有等级高于这个最小等级的英雄都有潜力通过历练达到 2000000000000000 级。
3. 计算潜力英雄数量
从数组的末尾开始,统计等级高于最小等级的英雄数量。
代码实现
go
复制
package main
import (
"fmt"
"sort"
)
func solution(n int, u []int) int {
// 对英雄等级进行排序
sort.Ints(u)
// 初始化计数器
count := 0
// 从数组末尾开始遍历
for i := n - 1; i >= 0; i-- {
// 如果当前英雄等级大于数组中最小等级,则计数器加1
if u[i] > u[0] {
count++
} else {
// 如果遇到第一个等级与最小等级相同的英雄,跳出循环
break
}
}
// 返回有潜力的英雄数量
return count
}
func main() {
fmt.Println(solution(5, []int{1, 2, 3, 1, 2})) // 输出: 3
fmt.Println(solution(4, []int{100000, 100000, 100000, 100000})) // 输出: 0
fmt.Println(solution(6, []int{1, 1, 1, 2, 2, 2})) // 输出: 3
}
代码解析
-
排序:
- 使用
sort.Ints对u数组进行排序,使得等级较高的英雄出现在数组的末尾。
- 使用
-
遍历查找:
- 从数组的末尾开始遍历,使用
for i := n - 1; i >= 0; i--循环。 - 如果当前英雄等级
u[i]大于数组中最小等级u[0],则计数器count加1。 - 如果遇到第一个等级与最小等级相同的英雄,跳出循环。
- 从数组的末尾开始遍历,使用
-
返回结果:
- 返回计数器
count,表示有潜力的英雄数量。
- 返回计数器
总结
通过上述方法,我们可以高效地计算出有多少英雄有潜力通过历练达到 2000000000000000 级。该方法的时间复杂度为 O(n log n),其中 n 是英雄的数量。这种方法在处理大规模数据时也能保持较高的效率。