Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
Example:
Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
Jump 1 step from index 0 to 1, then 3 steps to the last index.
Note:
You can assume that you can always reach the last index.
这道题目一看就觉得应该用动态规划做,因为后面的状态跟前面的有关。
先是暴力穷举的方法。
Python解法如下:
class Solution:
def jump(self, nums: List[int]) -> int:
length = len(nums)
result = [0x7fff_ffff]*length
result[0] = 0
for i in range(0, length):
temp = nums[i]
for j in range(1, min(temp, length-i-1)+1):
result[i+j] = min(result[i]+1, result[i+j])
return result[-1]
数据量大的时候直接超时了。
然后想到了暴力的方法可以优化:
class Solution:
def jump(self, nums: List[int]) -> int:
length = len(nums)
result = [None]*length
result[0] = 0
now = 0
for i in range(0, length):
for j in range(max(1, now-i), min(nums[i]+1, length-i)):
if result[i+j] == None:
result[i+j] = result[i]+1
now = i+j
return result[-1]
优化后时间复杂度为O(n),空间复杂度为O(n)。
可以通过所有样例了。
看了别人优化后的解法,更快,不需要O(N)的空间:
class Solution:
def jump(self, nums: List[int]) -> int:
length = len(nums)
jumps, curEnd, curFarthest = 0, 0, 0
for i in range(0, length-1):
curFarthest = max(curFarthest, i + nums[i])
if i == curEnd:
jumps+=1
curEnd = curFarthest
return jumps

本文探讨了LeetCode上的Jump Game II问题,通过动态规划解决数组中达到最后一个元素所需的最小跳跃次数。介绍了从暴力穷举到优化算法的过程,最终实现时间复杂度O(n)的解决方案。
504

被折叠的 条评论
为什么被折叠?



