小R设计了一款有趣的机器人,它每次移动时至少需要消耗一个能量值。假设当小R为机器人提供了 5 个能量值,它可以选择不动,也可以走 1 步,但它不会走超过 5 步。
小R希望机器人能够走到一个终点,该终点位于 N 个位置的最后一个位置。每个位置上都有一定的能量值,机器人每次消耗当前位置的能量值可以往前走几步,之后可以继续消耗新的位置的能量继续前进。如果某个位置的能量值为 0,机器人将无法再继续行动。
小R想知道,机器人是否有可能通过这些能量值移动到最后一个位置。你能帮他计算一下吗?
测试样例
样例1:
输入:
n = 5 ,array = [2, 3, 1, 1, 4]
输出:'TRUE'
样例2:
输入:
n = 5 ,array = [3, 2, 1, 0, 4]
输出:'FALSE'
样例3:
输入:
n = 6 ,array = [1, 2, 3, 4, 0, 0]
输出:'TRUE'
def solution(n, array):
# 初始化最远能够到达的位置
farthest = 0
for i in range(n):
# 如果当前位置无法到达,直接返回 'FALSE'
if i > farthest:
return "FALSE"
# 更新最远能到达的位置
farthest = max(farthest, i + array[i])
# 如果最远位置已经到达或超过终点位置,返回 'TRUE'
if farthest >= n - 1:
return "TRUE"
return "FALSE"
# 测试用例
if __name__ == "__main__":
print(solution(5, [2, 3, 1, 1, 4]) == "TRUE") # 应该返回 'TRUE'
print(solution(5, [3, 2, 1, 0, 4]) == "FALSE") # 应该返回 'FALSE'
print(solution(6, [1, 2, 3, 4, 0, 0]) == "TRUE") # 应该返回 'TRUE'
思路分析
- 基本情况:机器人可以从当前位置走 1 到
array[i]步,但如果当前位置上的能量值为0,就意味着机器人无法再继续前进。 - 关键观察:我们需要追踪机器人当前最远可以到达的位置。在每一步中,我们尝试更新最远能到达的位置,如果在某个位置上机器人不能再继续前进(即当前能到达的位置已经没有足够的能量前进),就意味着无法到达终点。
- 贪心算法:遍历
array数组,记录从当前位置可以到达的最远位置。如果在某个时刻,最远位置已经到达或超过终点,说明机器人可以成功到达终点。否则,如果某个位置无法前进到更远的地方,则失败。
算法步骤
- 从起点开始,初始时最远能到达的位置是 0。
- 遍历数组,对于每个位置
i,检查当前位置是否能够达到。若i小于或等于当前最远能到达的位置(表示可以从当前位置继续前进),则更新最远能到达的位置。 - 如果在某个时刻,最远能到达的位置大于等于
n-1(终点的位置),说明成功到达终点,返回'TRUE'。 - 如果遍历结束后,最远能到达的位置小于
n-1,说明无法到达终点,返回'FALSE'。 farthest:这是一个变量,用来记录机器人能够到达的最远位置。- 遍历数组:我们从位置 0 开始,检查是否可以到达当前的位置
i。如果当前位置不可达,直接返回'FALSE'。 - 更新最远位置:对于每一个可到达的位置,我们更新最远位置
farthest,它等于当前位置i加上当前位置的能量值array[i],即从当前位置能走的最远距离。 - 终止条件:如果在任何时候,最远位置
farthest达到了或超过了终点位置n-1,说明机器人可以成功到达终点,返回'TRUE'。
时间复杂度
- 该算法的时间复杂度是
O(n),因为我们只需要遍历数组一次。
测试结果
- 测试用例 1:输入
[2, 3, 1, 1, 4],输出'TRUE'。 - 测试用例 2:输入
[3, 2, 1, 0, 4],输出'FALSE'。 - 测试用例 3:输入
[1, 2, 3, 4, 0, 0],输出'TRUE'。