LeetCode 45. Jump Game II--Python解法--动态规划

LeetCode 45. Jump Game II–Python解法–动态规划


LeetCode题解专栏:LeetCode题解
LeetCode 所有题目总结:LeetCode 所有题目总结
大部分题目C++,Python,Java的解法都有。


题目地址:Jump Game II - LeetCode


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,python-做题)