DAY20:leetcode #45 Jump Game II

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.

For example:
Given array A = [2,3,1,1,4]

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.

Subscribe to see which companies asked this question

我的代码:

class Solution(object):
    def jump(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n_len = len(nums)
        if n_len <= 1:
            return 0
        #if nums[0] == 25000:    #这两句太过于黄暴,18禁
        #    return 2
        d_list = [999999] * n_len
        d_list[-1] = 0
        for i in range(n_len - 1)[::-1]:
            for j in range(i + 1, min(n_len , i + nums[i] + 1)):
                if (d_list[j] + 1) < d_list[i]:
                        d_list[i] = d_list[j] + 1
        return d_list[0]

上述是我的代码,思路是从数组后端往前遍历,记录每个格子到最后一个格子的最小步数,一直记录到最前面,就得到了答案。

实际运行中,最后一组测试用例始终无法通过。代码已经非常精简,怀疑必须是O(n)复杂度的算法才可以通过。

class Solution(object):
    def jump(self, A):    
        ret = 0
        last = 0
        curr = 0
        for i in range(len(A)):
            if i > last:
                last = curr
                ret += 1
            curr = max(curr, i+A[i])
        return ret

大神的代码总是可以如此风骚。

几个变量的解释:

last:上一步能走到的最远距离

curr:从上一步覆盖的范围中,选择能走到最远的一步,记录这一步的距离

ret:步数

然后思路就是,每当i超出上一步覆盖的距离时,就从上一步的可行范围中选择最远的一步,走出这一步。

膜拜大神

再补充一句:我的解法相当于遍历了整个解空间,只是利用了一些技巧使得复杂度控制在O(n^2)

discuss解法运用了一个等效条件:最快走完整个数组的解法(也就是走到数组外面去),一定是最快的走到目的地的,所以这个解法不专注于考虑走到目的地需要的步数,直接大步向前走,最快走到数组最后的步数,就是走到目的地的步数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值