解题策略
- 贪心算法:通过调整小F的英雄出场顺序,最大化获胜轮数。
- 关键步骤:
- 排序:对小F的英雄能力值进行排序,以便从小到大选择英雄。
- 双指针法:
u_index:遍历小U的英雄能力值(从1到n)。
f_index:遍历小F的英雄能力值(从小到大)。
- 比较与移动:
- 如果小F的英雄能力值大于小U的英雄能力值,则小F获胜,两个指针都向前移动。
- 否则,只移动小F的指针,继续寻找下一个可能获胜的英雄。
代码实现
def solution(number, heroes):
heroes.sort()
wins = 0
u_index = 1
f_index = 0
while u_index <= number and f_index < number:
if heroes[f_index] > u_index:
wins += 1
u_index += 1
f_index += 1
else:
f_index += 1
return wins
关键点总结
- 排序:对小F的英雄能力值进行排序,以便从小到大选择英雄。
- 双指针法:
u_index:遍历小U的英雄能力值(从1到n)。
f_index:遍历小F的英雄能力值(从小到大)。
- 比较与移动:
- 如果小F的英雄能力值大于小U的英雄能力值,则小F获胜,两个指针都向前移动。
- 否则,只移动小F的指针,继续寻找下一个可能获胜的英雄。
复杂度分析
- 时间复杂度:
O(n log n),主要由排序操作决定。
- 空间复杂度:
O(1),只使用了常数级别的额外空间。
测试样例
- 样例1:
- 输入:
number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]
- 输出:
4
- 样例2:
- 输入:
number = 5, heroes = [1, 1, 1, 1, 1]
- 输出:
0
- 样例3:
- 输入:
number = 6, heroes = [9, 4, 7, 3, 2, 6]
- 输出:
6