笔记:英雄决斗的最大胜利次数
问题描述
输入输出
-
输入:两个参数,
n表示小U的英雄数量,f表示小F的英雄能力值列表。 -
输出:一个整数,表示小F赢得的轮数。
算法设计
-
初始化:创建小U的英雄能力值列表
u,范围从1到n。对小F的英雄能力值列表f进行排序。 -
双指针遍历:使用两个指针
u_idx和f_idx分别遍历小U和小F的英雄列表。 -
比较英雄能力值:在每一轮中,比较两个队伍当前指针所指的英雄能力值。
- 如果小F的英雄能力值大于小U的,小F赢得这一轮,两个指针都向后移动。
- 如果小F的英雄能力值不大于小U的,小F尝试下一个英雄,只有小F的指针向后移动。
- 计数胜利:每赢得一轮,胜利计数
wins加1。
代码实现
def solution(n, f):
u = list(range(1, n + 1)) # 小U的英雄能力值
f.sort() # 排序小F的英雄能力值
u_idx = 0 # 小U的指针
f_idx = 0 # 小F的指针
wins = 0 # 胜利计数
while u_idx < n and f_idx < n:
if f[f_idx] > u[u_idx]:
wins += 1 # 小F赢得这一轮
u_idx += 1 # 小U的指针向后移动
f_idx += 1 # 小F的指针向后移动
else:
f_idx += 1 # 小F无法赢得这一轮,尝试下一个英雄
return wins
测试样例
-
测试样例1:
solution(7, [10,1,1,1,5,5,3])返回4。 -
测试样例2:
solution(5, [1,1,1,1,1])返回0。 -
测试样例3:
solution(10, [1,2,3,4,5,6,7,8,9,10])返回9。
总结
这个算法通过双指针技巧和排序,有效地解决了小F与小U的英雄对战问题。它的时间复杂度主要由排序步骤决定,为 O(n log n),其中 n 是小F的英雄数量。这种方法简单且高效,适用于处理此类问题。