《英雄决斗的最大胜利次数》| 豆包MarsCode AI刷题

89 阅读2分钟

笔记:英雄决斗的最大胜利次数

 

问题描述

QQ浏览器截图20241117205049.png

 

输入输出

  • 输入:两个参数,n 表示小U的英雄数量,f 表示小F的英雄能力值列表。

  • 输出:一个整数,表示小F赢得的轮数。

 

算法设计

  1. 初始化:创建小U的英雄能力值列表 u,范围从1到n。对小F的英雄能力值列表 f 进行排序。

  2. 双指针遍历:使用两个指针 u_idxf_idx 分别遍历小U和小F的英雄列表。

  3. 比较英雄能力值:在每一轮中,比较两个队伍当前指针所指的英雄能力值。

   - 如果小F的英雄能力值大于小U的,小F赢得这一轮,两个指针都向后移动。

   - 如果小F的英雄能力值不大于小U的,小F尝试下一个英雄,只有小F的指针向后移动。

  1. 计数胜利:每赢得一轮,胜利计数 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

 

测试样例

  • 测试样例1solution(7, [10,1,1,1,5,5,3]) 返回 4

  • 测试样例2solution(5, [1,1,1,1,1]) 返回 0

  • 测试样例3solution(10, [1,2,3,4,5,6,7,8,9,10]) 返回 9

 

总结

这个算法通过双指针技巧和排序,有效地解决了小F与小U的英雄对战问题。它的时间复杂度主要由排序步骤决定,为 O(n log n),其中 n 是小F的英雄数量。这种方法简单且高效,适用于处理此类问题。