leetcode 55 Jump Game 详细解答

leetcode 55 Jump Game 详细解答

leetcode 55 Jump Game 详细解答
解答1:
此题需要从后往前考虑,
需要初始化一个额外的数组dp,用以保存下标 i 是否能够到达数组nums最后的下标,如果能到达, dp[ i ] = True
如果不能到达,dp[ i ] = False
所以
示例1中的数组dp就是 [True, True, True, True]
示例2中的数组dp就是 [False, False, False, False, True]

如何判断下标 i 是否能到达数组nums最后的下标呢?
情况1:
如果 i + nums[i] >= len(nums)-1 则肯定能到达

情况2:
若下标 i 能到达的位置中, 即 i, i+1, …, i+nums[i],有可以到达数组nums最后下标的,说明也可以

最后的代码结果如下:

leetcode 55 Jump Game 详细解答但是这种方式的时间复杂度是O(N^2),空间复杂度是O(N),所以在leetcode提交会超时。


解答2:
优化:
从后向前考虑,是否能到达数组nums最后一个下标,是否能到达数组nums倒数第2个下标,是否能到达倒数第3个小标,…,是否能到达数组nums倒数第N个下标。
在这里初始化一个数组dp = [0] * N

代码如下
leetcode 55 Jump Game 详细解答
时间复杂度O(N),空间复杂度O(N)


解答3
由解答2得到,只需要定义一个下标 index, 跟踪可以到达数组nums最后一个下标的下标,所以在这只需要定义一个index即可,不需要dp数组。
代码如下:
leetcode 55 Jump Game 详细解答
时间复杂度O(N),空间复杂度O(1)