• [LeetCode] 45. 跳跃游戏 II


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

    题目描述:

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

    数组中的每个元素代表你在该位置可以跳跃的最大长度。

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

    示例:

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

    思路:

    思路一:

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

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

    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)就过不了,没想到真的过不了,哈哈!

    思路2: 贪心算法

    类似与BFS

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

    所以,如果一开始都能跳到,后面再跳到的肯定步数要变多!

    时间复杂度:(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;
        }
    }
    
  • 相关阅读:
    深入理解.NET(第2版.英文影印版)书评
    揭示同步块索引(上):从lock开始
    【读书笔记】.NET本质论第一章 The CLR as a Better COM
    【翻译】TestAfter Development is not TestDriven Development
    【读书笔记】.NET本质论第二章Components(Part One)
    Python和Ruby:流行动态脚本语言之特点对比
    C++ Unit Testing Framework: A Boost Test Tutorial——part2:Using Boost Test
    组态软件开发(zz)
    用于实现拖入操作的通用类
    找到一个脚本引擎
  • 原文地址:https://www.cnblogs.com/powercai/p/10870370.html
Copyright © 2020-2023  润新知