[LeetCode] 45. 跳跃游戏 II

题目连接 : https://leetcode-cn.com/problems/jump-game-ii/java

题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。python

数组中的每一个元素表明你在该位置能够跳跃的最大长度。算法

你的目标是使用最少的跳跃次数到达数组的最后一个位置。数组

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,而后跳 3 步到达数组的最后一个位置。

思路:

思路一:spa

刚开始,我想用动态规划,用dp[i]表示到i位置的最少步数code

动态方程为:dp[i] = min(dp[i], dp[j] + 1),j位置能够到达i 的位置,代码以下:leetcode

class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [float("inf")] * n
        dp[0] = 0
        for i in range(1, len(nums)):
            for j in range(i):
                if nums[j] >= i - j:
                    dp[i] = min(dp[i], dp[j] + 1)
        #print(dp)
        return dp[-1]
public class JumpGameII {
    public int jump(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = 0;
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Integer.MAX_VALUE;
            for (int j = 0; j < i; j++) {
                if (nums[j] >= i - j) {
                    dp[i] = Math.min(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[nums.length - 1];
    }
}

可是, 这是$O(n^2)$算法,若是数据超过$10^4$就过不了,没想到真的过不了,哈哈!get

思路2: 贪心算法io

相似与BFSclass

一句话解释: 从一个位置跳到它能跳到的最远位置之间的都只须要一步!

因此,若是一开始都能跳到,后面再跳到的确定步数要变多!

时间复杂度:$O(n)$


关注个人知乎专栏,了解更多的解题技巧,共同进步!

代码:

python

class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1 : return 0
        dp = [0] * n
        for i in range(n):
            for j in range(nums[i], 0, -1):
                if i + j >= n - 1 : return dp[i] + 1
                elif dp[i + j] == 0:
                    dp[i + j] = dp[i] + 1
                else:
                    break
        return "到底不了最后"

java

class Solution {
    public int jump(int[] nums) {
        if (nums.length == 1) return 0;
        int[] dp = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            for (int j = nums[i]; j > 0; j--) {
                if (i + j >= nums.length - 1) {
                    return dp[i] + 1;
                } else if (dp[i + j] == 0) {
                    dp[i + j] = dp[i] + 1;
                } else {
                    break;
                }
            }
        }
        return 0;
    }
}
相关文章
相关标签/搜索