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

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

题目地址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值