问题描述
小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'
解题思路
以下来自MarsCode
-
理解问题:机器人需要从第一个位置移动到最后一个位置。每个位置都有一个能量值,表示机器人可以从该位置向前移动的最大步数。如果某个位置的能量值为0,机器人将无法继续前进。
-
数据结构选择:我们可以使用一个变量来跟踪当前位置,并使用一个循环来模拟机器人的移动。
-
算法步骤:
- 初始化当前位置为0。
- 使用一个循环,每次检查当前位置的能量值。
- 如果当前位置的能量值为0且不是最后一个位置,返回
'FALSE'。 - 否则,更新当前位置为当前位置加上当前位置的能量值。
- 如果当前位置已经超过或等于最后一个位置,返回
'TRUE'。
具体代码如下:
def solution(n, array):
# 初始化当前位置
current_position = 0
# 使用循环模拟机器人的移动
while current_position < n:
# 获取当前位置的能量值
energy = array[current_position]
# 如果当前位置的能量值为0且不是最后一个位置,返回'FALSE'
if energy == 0 and current_position != n - 1:
return "FALSE"
# 更新当前位置为当前位置加上当前位置的能量值,但最多只能加5步
current_position += min(energy, 5)
# 如果当前位置已经超过或等于最后一个位置,返回'TRUE'
if current_position >= n - 1:
return "TRUE"
# 如果循环结束仍未返回,说明机器人无法到达终点
return "FALSE"
if __name__ == "__main__":
# Add your test cases here
print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")
print(solution(6, [1, 2, 3, 4, 0, 0]) == "TRUE")
此时第8个测试出现了错误,我认为是在0的处理上出现了问题
于是我改用贪心算法,通过更新每一步能够到达的最远距离来判断是否能够到达最后一个位置。步骤如下:
-
初始化:设定一个变量
reach表示当前能够到达的最远距离,初始值为0。 -
遍历数组:遍历数组每个元素,对于每个位置
i:- 如果
i > reach,表示当前位置无法到达,直接返回'FALSE'。 - 更新
reach = max(reach, i + array[i]),即当前能到达的最远距离。
- 如果
-
检查可达性:如果遍历结束后,
reach >= n-1,则返回'TRUE',否则返回'FALSE'。
具体代码如下:
def solution(n, array):
reach = 0 # 初始化最远可达位置
for i in range(n):
if i > reach:
return 'FALSE' # 当前位置无法到达
reach = max(reach, i + array[i]) # 更新最远可达位置
if reach >= n - 1:
return 'TRUE'
return 'FALSE'
if __name__ == "__main__":
# Add your test cases here
print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")
print(solution(6, [1, 2, 3, 4, 0, 0]) == "TRUE")
print(solution(25, [3,4,4,1,4,3,0,4,4,4,2,2,0,1,1,2,1,3,2,4,0,2,4,3,3]) == "TRUE")
此时就能通过了