青训机器人能量冒险

48 阅读3分钟

小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. 基本情况:机器人可以从当前位置走 1 到 array[i] 步,但如果当前位置上的能量值为 0,就意味着机器人无法再继续前进。
  2. 关键观察:我们需要追踪机器人当前最远可以到达的位置。在每一步中,我们尝试更新最远能到达的位置,如果在某个位置上机器人不能再继续前进(即当前能到达的位置已经没有足够的能量前进),就意味着无法到达终点。
  3. 贪心算法:遍历 array 数组,记录从当前位置可以到达的最远位置。如果在某个时刻,最远位置已经到达或超过终点,说明机器人可以成功到达终点。否则,如果某个位置无法前进到更远的地方,则失败。

算法步骤

  1. 从起点开始,初始时最远能到达的位置是 0。
  2. 遍历数组,对于每个位置 i,检查当前位置是否能够达到。若 i 小于或等于当前最远能到达的位置(表示可以从当前位置继续前进),则更新最远能到达的位置。
  3. 如果在某个时刻,最远能到达的位置大于等于 n-1(终点的位置),说明成功到达终点,返回 'TRUE'
  4. 如果遍历结束后,最远能到达的位置小于 n-1,说明无法到达终点,返回 'FALSE'
  5. farthest:这是一个变量,用来记录机器人能够到达的最远位置。
  6. 遍历数组:我们从位置 0 开始,检查是否可以到达当前的位置 i。如果当前位置不可达,直接返回 'FALSE'
  7. 更新最远位置:对于每一个可到达的位置,我们更新最远位置 farthest,它等于当前位置 i 加上当前位置的能量值 array[i],即从当前位置能走的最远距离。
  8. 终止条件:如果在任何时候,最远位置 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'