AI 刷题 129. 最大战力值 题解 | 豆包MarsCode AI刷题

88 阅读4分钟

问题描述

小F正在设计一款手游,需要为游戏角色设定战力值,并确保符合以下规则:

  1. 初始战力值:编号为 0 的角色战力值固定为 0。
  2. 非负战力值:所有角色战力值必须为非负整数。
  3. 战力值差异限制:相邻角色的战力值差不能超过 1,即两相邻角色的战力值差可以是 0+1-1
  4. 最大战力值限制:对于某些编号为 index 的角色,其战力值有上限 maxPower,这些限制通过数对 limit[i] = [index, maxPower] 提供。

任务是根据这些规则,计算所有角色中单个角色能够达到的最大战力值。

思路解析

解决问题需要综合考虑初始条件、相邻限制和给定的最大战力值限制,我们的目标是确保在满足所有约束的情况下,尽可能提高角色的战力值上限。

核心思路:动态调整战力值

  1. 初始化战力值数组
    初始时,假设所有角色的战力值为正无穷(表示没有限制),然后根据限制条件逐步调整。
  2. 应用限制条件
    根据输入的 limit 数组,将限制的战力值直接赋值到对应角色,更新其上限。
  3. 从左到右调整
    确保每个角色的战力值不超过左侧相邻角色的战力值加 1。
  4. 从右到左调整
    确保每个角色的战力值不超过右侧相邻角色的战力值加 1。
  5. 计算结果
    最终数组中的最大值即为所有角色的最大战力值。

解题步骤

步骤 1:初始化

  • 创建一个长度为 n 的数组 power,初始值为无穷大。
  • 将编号为 0 的角色战力值设为 0,因为其初始值固定。
  • 根据 limits 数组,更新对应角色的最大战力值限制。

步骤 2:从左到右更新

  • 遍历数组,确保每个角色的战力值不超过左侧相邻角色战力值加 1。

步骤 3:从右到左更新

  • 倒序遍历数组,确保每个角色的战力值不超过右侧相邻角色战力值加 1。

步骤 4:计算最大战力值

  • 遍历更新后的数组 power,求其中的最大值。

复杂度分析

  1. 时间复杂度

    • 初始化和限制条件的应用:O(m),其中 m 是限制数组的长度。
    • 左到右、右到左调整:各 O(n),其中 n 是角色数量。
    • 总时间复杂度为 O(n + m)
  2. 空间复杂度

    • 只使用了一个长度为 n 的数组存储战力值,空间复杂度为 O(n)

Python 实现

def solution(n, m, limits):
    # 初始化战力值数组,初始值为正无穷大
    power = [float('inf')] * n
    power[0] = 0  # 编号为 0 的角色战力值固定为 0

    # 应用限制条件,更新最大战力值
    for index, maxPower in limits:
        power[index] = min(power[index], maxPower)

    # 从左到右调整战力值
    for i in range(1, n):
        power[i] = min(power[i], power[i - 1] + 1)

    # 从右到左调整战力值
    for i in range(n - 2, -1, -1):
        power[i] = min(power[i], power[i + 1] + 1)

    # 最大战力值是最终数组中的最大值
    max_power = max(power)
    return max_power

if __name__ == "__main__":
    # 测试用例
    print(solution(3, 2, [[1, 3], [2, 2]]) == 2)  # 示例 1
    print(solution(5, 3, [[1, 1], [2, 3], [4, 3]]) == 3)  # 示例 2
    print(solution(4, 1, [[2, 2]]) == 3)  # 示例 3

测试样例解析

样例 1

输入:n = 3, m = 2, limits = [[1, 3], [2, 2]]
过程:

  1. 初始化:power = [0, inf, inf]
  2. 应用限制:power = [0, 3, 2]
  3. 从左到右:power = [0, 1, 2]
  4. 从右到左:power = [0, 1, 2]
    结果:max_power = 2

样例 2

输入:n = 5, m = 3, limits = [[1, 1], [2, 3], [4, 3]]
过程:

  1. 初始化:power = [0, inf, inf, inf, inf]
  2. 应用限制:power = [0, 1, 3, inf, 3]
  3. 从左到右:power = [0, 1, 2, 3, 3]
  4. 从右到左:power = [0, 1, 2, 3, 3]
    结果:max_power = 3

样例 3

输入:n = 4, m = 1, limits = [[2, 2]]
过程:

  1. 初始化:power = [0, inf, inf, inf]
  2. 应用限制:power = [0, inf, 2, inf]
  3. 从左到右:power = [0, 1, 2, 3]
  4. 从右到左:power = [0, 1, 2, 3]
    结果:max_power = 3