问题描述
小F正在设计一款手游,需要为游戏角色设定战力值,并确保符合以下规则:
- 初始战力值:编号为 0 的角色战力值固定为 0。
- 非负战力值:所有角色战力值必须为非负整数。
- 战力值差异限制:相邻角色的战力值差不能超过 1,即两相邻角色的战力值差可以是
0、+1或-1。 - 最大战力值限制:对于某些编号为
index的角色,其战力值有上限maxPower,这些限制通过数对limit[i] = [index, maxPower]提供。
任务是根据这些规则,计算所有角色中单个角色能够达到的最大战力值。
思路解析
解决问题需要综合考虑初始条件、相邻限制和给定的最大战力值限制,我们的目标是确保在满足所有约束的情况下,尽可能提高角色的战力值上限。
核心思路:动态调整战力值
- 初始化战力值数组:
初始时,假设所有角色的战力值为正无穷(表示没有限制),然后根据限制条件逐步调整。 - 应用限制条件:
根据输入的limit数组,将限制的战力值直接赋值到对应角色,更新其上限。 - 从左到右调整:
确保每个角色的战力值不超过左侧相邻角色的战力值加 1。 - 从右到左调整:
确保每个角色的战力值不超过右侧相邻角色的战力值加 1。 - 计算结果:
最终数组中的最大值即为所有角色的最大战力值。
解题步骤
步骤 1:初始化
- 创建一个长度为
n的数组power,初始值为无穷大。 - 将编号为 0 的角色战力值设为 0,因为其初始值固定。
- 根据
limits数组,更新对应角色的最大战力值限制。
步骤 2:从左到右更新
- 遍历数组,确保每个角色的战力值不超过左侧相邻角色战力值加 1。
步骤 3:从右到左更新
- 倒序遍历数组,确保每个角色的战力值不超过右侧相邻角色战力值加 1。
步骤 4:计算最大战力值
- 遍历更新后的数组
power,求其中的最大值。
复杂度分析
-
时间复杂度:
- 初始化和限制条件的应用:
O(m),其中m是限制数组的长度。 - 左到右、右到左调整:各
O(n),其中n是角色数量。 - 总时间复杂度为
O(n + m)。
- 初始化和限制条件的应用:
-
空间复杂度:
- 只使用了一个长度为
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]]
过程:
- 初始化:
power = [0, inf, inf] - 应用限制:
power = [0, 3, 2] - 从左到右:
power = [0, 1, 2] - 从右到左:
power = [0, 1, 2]
结果:max_power = 2
样例 2
输入:n = 5, m = 3, limits = [[1, 1], [2, 3], [4, 3]]
过程:
- 初始化:
power = [0, inf, inf, inf, inf] - 应用限制:
power = [0, 1, 3, inf, 3] - 从左到右:
power = [0, 1, 2, 3, 3] - 从右到左:
power = [0, 1, 2, 3, 3]
结果:max_power = 3
样例 3
输入:n = 4, m = 1, limits = [[2, 2]]
过程:
- 初始化:
power = [0, inf, inf, inf] - 应用限制:
power = [0, inf, 2, inf] - 从左到右:
power = [0, 1, 2, 3] - 从右到左:
power = [0, 1, 2, 3]
结果:max_power = 3