英雄决斗的最大的胜利次数

88 阅读2分钟

解题策略

  • 贪心算法:通过调整小F的英雄出场顺序,最大化获胜轮数。
  • 关键步骤
    1. 排序:对小F的英雄能力值进行排序,以便从小到大选择英雄。
    2. 双指针法
      • u_index:遍历小U的英雄能力值(从1到n)。
      • f_index:遍历小F的英雄能力值(从小到大)。
    3. 比较与移动
      • 如果小F的英雄能力值大于小U的英雄能力值,则小F获胜,两个指针都向前移动。
      • 否则,只移动小F的指针,继续寻找下一个可能获胜的英雄。

代码实现

def solution(number, heroes):
    # 对小F的英雄能力值进行排序
    heroes.sort()
    
    # 初始化获胜轮数
    wins = 0
    
    # 初始化两个指针
    u_index = 1  # 小U的英雄能力值从1开始
    f_index = 0  # 小F的英雄能力值从排序后的第一个开始
    
    # 遍历小U的英雄能力值
    while u_index <= number and f_index < number:
        # 如果小F的英雄能力值大于小U的英雄能力值
        if heroes[f_index] > u_index:
            # 小F获胜,增加获胜轮数
            wins += 1
            # 两个指针都向前移动
            u_index += 1
            f_index += 1
        else:
            # 否则,只移动小F的指针
            f_index += 1
    
    return wins

关键点总结

  1. 排序:对小F的英雄能力值进行排序,以便从小到大选择英雄。
  2. 双指针法
    • u_index:遍历小U的英雄能力值(从1到n)。
    • f_index:遍历小F的英雄能力值(从小到大)。
  3. 比较与移动
    • 如果小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