题目解析 英雄决斗的最大胜利次数 | 豆包MarsCode AI刷题

86 阅读4分钟

问题描述

小U和小F正在进行一场由 𝑛n 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,𝑛1,2,3,…,n 安排了他的英雄出场顺序。

小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。

输入说明

  • number: 一个整数,表示比赛的总轮数 𝑛n。
  • heroes: 一个长度为 𝑛n 的正整数数组,表示小 F 的每个英雄的能力值。

输出

  • 返回一个整数,表示小 F 可以获得的最大胜利轮数。

测试样例

样例1:

输入:number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]
输出:4

样例2:

输入:number = 5, heroes = [1, 1, 1, 1, 1]
输出:0

思路分析

  1. 最大化胜利:目标是帮助小F通过调整英雄出场顺序,获得尽可能多的胜利轮数。
  2. 能力值比较:每一轮的胜利取决于小F的英雄能力值是否高于小U的英雄能力值。
  3. 排序策略:将小F的英雄按能力值从高到低排序,以便优先派出能力值最高的英雄。
  4. 动态比较:通过比较小F的英雄能力值与小U的当前能力值(从1递增至n),动态决定每轮的胜负。

算法步骤

  1. 排序:将小F的英雄能力值列表按照从大到小的顺序排序。
  2. 初始化:设置一个变量 num 表示小U当前的英雄能力值索引,初始值为n(即小U的最后一位英雄)。
  3. 遍历:遍历排序后的小F英雄能力值列表。
  4. 比较:对于每个英雄,比较其能力值与 num
  5. 获胜条件:如果小F的英雄能力值大于 num,则小F在这一回合获胜,将这个英雄加入胜利的袋子 bag,并减少 num
  6. 失败或平局处理:如果小F的英雄能力值小于或等于 num,则减少 num 直到找到一个更小的值或者 num 减至0。
  7. 终止:当 num 为0或者遍历完小F的所有英雄后,停止遍历。
  8. 输出结果:返回 bag 的大小,即小F可以获得的最大胜利轮数

代码

def solution(number, heroes):
    # Please write your code here
    # 将小F的英雄能力值由大到小排序
    heroes.sort(reverse=True)
    bag = []  # 用于存储小F获胜的英雄
    num = number  # 小U的英雄能力值,从n开始
    # 遍历小F的英雄能力值
    for i in heroes:
        #如果小F的英雄能力值小于等于小U当前的英雄能力值
        while i <= num and num != 0:
            num -= 1# 小U的英雄能力值1
        # 如果小U的英雄能力值已经为0,或者小F的英雄能力值大于小U的,则退出循环
        if num == 0:
            break
        bag.append(i)  # 小F的英雄加入胜利的袋子
        num -= 1  # 小U的英雄能力值索引减1

    # 返回小F可以获得的最大胜利轮数
    return len(bag)

复杂度分析

时间复杂度分析
  1. 排序操作:函数中首先对小F的英雄能力值列表进行排序。这个列表的长度为 number(即 n)。排序操作的时间复杂度通常为 𝑂(𝑛log⁡𝑛)O(nlogn)。
  2. 遍历操作:排序后,我们遍历这个列表一次。这个操作的时间复杂度为 𝑂(𝑛)O(n)。
  3. while循环:在遍历过程中,我们有一个while循环,它在最坏情况下可能会执行 n 次(当 i 总是小于等于 num 时)。然而,由于 num 在每次循环中至少减少1,这个循环的执行次数不会超过 n。因此,while循环的时间复杂度为 𝑂(𝑛)O(n)。

综合考虑,整个函数的时间复杂度主要由排序操作决定,即 𝑂(𝑛log⁡𝑛)O(nlogn)。

空间复杂度分析
  1. 排序:排序操作通常需要 𝑂(𝑛)O(n) 的额外空间来存储排序后的列表,但这取决于使用的排序算法。在Python中,sort() 方法是就地排序,不占用额外空间,因此空间复杂度为 𝑂(1)O(1)。
  2. 胜利袋子:我们使用一个列表 bag 来存储小F获胜的英雄。在最坏情况下,bag 可以存储所有 n 个英雄,因此其空间复杂度为 𝑂(𝑛)O(n)。

综合考虑,整个函数的空间复杂度主要由胜利袋子决定,即 𝑂(𝑛)O(n)。

  • 时间复杂度:𝑂(𝑛log⁡𝑛)O(nlogn)
  • 空间复杂度:𝑂(𝑛)O(n)