. 函数定义
pythonCopy Code
def solution(number, heroes):
number是小U的英雄数量,同时也是小F英雄的数量。heroes是一个列表,包含了小F每个英雄的能力值。
2. 小U的英雄能力值初始化
pythonCopy Code
u_heroes = list(range(1, number + 1))
- 小U的英雄能力值是从
1到number的一系列整数,因此u_heroes是一个从1到number的递增列表。 - 举例来说,如果
number = 7,那么u_heroes就是[1, 2, 3, 4, 5, 6, 7]。
3. 小F英雄能力值排序
pythonCopy Code
heroes.sort()
- 小F的英雄能力值存储在
heroes列表中,使用heroes.sort()对这个列表进行升序排序。 - 排序是为了便于后面使用贪心算法和双指针策略,使小F每次能够选择最小的能战胜小U英雄的英雄。
4. 双指针初始化
pythonCopy Code
u_idx = 0
f_idx = 0
wins = 0
u_idx用来指向小U英雄列表的当前英雄,初始指向小U的第一个英雄(索引为0)。f_idx用来指向小F英雄列表的当前英雄,初始指向小F的第一个英雄(索引为0)。wins变量记录小F的胜利次数,初始化为0。
5. 双指针遍历
pythonCopy Code
while u_idx < number and f_idx < number:
if heroes[f_idx] > u_heroes[u_idx]: # 小F的英雄可以赢
wins += 1
u_idx += 1 # 小U的英雄进入下一轮
f_idx += 1 # 小F的英雄进入下一轮
-
while u_idx < number and f_idx < number::当小U和小F的英雄都有剩余时,继续比赛。 -
if heroes[f_idx] > u_heroes[u_idx]:如果小F当前英雄的能力值大于小U当前英雄的能力值,说明小F可以击败小U的英雄。wins += 1:小F胜利,增加胜利次数。u_idx += 1:小U的英雄进入下一轮比赛(即小U的英雄指针右移)。
-
无论小F是否胜利,
f_idx += 1:小F的英雄指针都会后移,表示小F使用了一个英雄。
6. 返回结果
pythonCopy Code
return wins
- 循环结束后,返回小F的胜利次数
wins。
7. 测试用例
pythonCopy Code
if __name__ == "__main__":
print(solution(7, [10, 1, 1, 1, 5, 5, 3])) # 4
print(solution(5, [1, 1, 1, 1, 1])) # 0
print(solution(6, [9, 4, 7, 3, 2, 6])) # 6
测试用例1:solution(7, [10, 1, 1, 1, 5, 5, 3])
-
小U的英雄能力值:
[1, 2, 3, 4, 5, 6, 7] -
小F的英雄能力值:
[1, 1, 1, 3, 5, 5, 10](排序后的结果) -
比赛过程:
- 小F用
3击败小U的1。 - 小F用
5击败小U的2。 - 小F用另一个
5击败小U的4。 - 小F用
10击败小U的6。
- 小F用
-
小F获得了4次胜利,返回
4。
测试用例2:solution(5, [1, 1, 1, 1, 1])
-
小U的英雄能力值:
[1, 2, 3, 4, 5] -
小F的英雄能力值:
[1, 1, 1, 1, 1] -
比赛过程:
- 小F的所有英雄能力值都比小U的英雄低,因此小F无法战胜任何小U的英雄。
-
小F没有胜利,返回
0。
测试用例3:solution(6, [9, 4, 7, 3, 2, 6])
-
小U的英雄能力值:
[1, 2, 3, 4, 5, 6] -
小F的英雄能力值:
[2, 3, 4, 6, 7, 9](排序后的结果) -
比赛过程:
- 小F用
2击败小U的1。 - 小F用
3击败小U的2。 - 小F用
4击败小U的3。 - 小F用
6击败小U的4。 - 小F用
7击败小U的5。 - 小F用
9击败小U的6。
- 小F用
-
小F获得了6次胜利,返回
6。
8. 时间复杂度分析
- 排序:排序
heroes列表的时间复杂度是O(n log n),其中n是英雄的数量。 - 双指针遍历:双指针遍历
u_heroes和heroes的时间复杂度是O(n),每个英雄最多被访问一次。 - 总时间复杂度:
O(n log n),由于排序是最耗时的操作。
9. 空间复杂度分析
- 主要的空间开销是存储两个列表:
heroes和u_heroes,它们的空间复杂度是O(n),其中n是英雄的数量。
总结
这段代码通过使用贪心算法和双指针策略,实现了一个高效的解决方案。小F通过尽量使用最小的英雄战胜小U的英雄,从而最大化小F的胜利次数。时间复杂度为 O(n log n),非常适合中等规模的输入。