【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )

这篇具有很好参考价值的文章主要介绍了【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。






一、跳跃游戏



LeetCode 55. 跳跃游戏 : https://leetcode.cn/problems/jump-game/

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

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

判断你 是否能够到达最后一个下标。





二、算法分析



给定一个一维数组 , 数组元素不能有负数 , 如 : {2, 2, 0 , 1} ;


开始时 , 处于 第 0 个元素 2 位置 , 则说明 最多可以向右跳 2 步 , 其可以跳 0 步 , 1 步 , 2 步 ;

  • 如果从 第 0 个元素 向右跳 2 步 , 跳到的 第 2 个元素 0 位置 , 则在第 2 个元素位置 最多只能向右跳 0 步 , 永远无法跳到终点 ;
  • 如果从 第 0 个元素 向右跳 0 步 , 原地不动 , 没有任何意义 ;

因此 , 这里 选择向右跳 1 步 , 跳到 第 1 个元素 2 位置 ;


第 1 个元素 2 位置 可以选择向右 跳 0 步 , 1 步 , 2 步 ;

  • 选择跳 0 步 没有意义 ;
  • 选择跳 1 步 到达 第 2 个元素 0 位置 , 永远无法到达终点 ;
  • 选择跳 2 步 , 可以到达终点 ;

该问题可以使用 动态规划 算法 进行解决 ;

① 可行性 : 上述问题 , 最终问的是 可行性 , 也就是方案数 大于 0 即可 ;

② 方向性 : 一维数组元素都是大于等于 0 的 , 从左到右跳跃 , 有方向性 ;

③ 一维数组 : 问题是基于一维数组的 , 是变换下标的问题 , 符合 坐标型动态规划 中的一维坐标动态规划 ;





三、代码示例



代码示例 :

class Solution {

    public boolean canJump(int[] array) {
        // 验证函数参数
        if (array == null || array.length == 0) {
            return false;
        }

        // 1. 动态规划状态 State
        // dp[i] 表示 从 0 位置出发能否跳到 i 位置
        boolean[] dp = new boolean[array.length];

        // 2. 动态规划初始化 Initialize
        // 跳跃游戏初始位置就是 0 位置 , 该位置肯定能跳到
        dp[0] = true;

        // 3. 动态规划方程 Function
        // dp[i] 表示的 i 位置是否可达, 依赖于 小于 i 的 j 位置
        // 在 j 位置可达的前提下
        // 从 j 开始进行跳跃 , 可以跳转到 i 或者越过 i 则表示 i 点可达
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < i; j++) {
                // dp[j] 表示 j 位置是否可达
                // j + array[j] 表示 从 j 位置开始跳跃 , 最多跳跃 array[j] , 看是否大于等于 i
                // 这里判定大于等于 是因为 可以不用跳跃 array[j] 那么多
                // 0 ~ array[j] 中肯定有正好等于 i 的数值
                if (dp[j] && j + array[j] >= i) {
                    dp[i] = true;
                    break;
                }
            }
        }

        // 4. 动态规划答案 Answer
        return dp[array.length - 1];
    }

    public static void main(String[] args) {
        int[] array = {2, 2, 0 , 1};
        boolean result = new Solution().canJump(array);
        System.out.println("最终能否达到终点 : " + result);
    }
}

执行结果 :文章来源地址https://www.toymoban.com/news/detail-693211.html

最终能否达到终点 : true

到了这里,关于【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode55. 跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 示例 2: 方法一:贪心 我们可以用贪心的方法解决这个问题。 设想一下,对于数组中的任意一个位置 y,我们如何判

    2024年02月02日
    浏览(28)
  • leetcode55.跳跃游戏 【贪心】

    题目: 给你一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回  true  ;否则,返回  false  。 示例: 示例 1: 示例 2: 思路: 不能遍历依次遍历每

    2024年02月10日
    浏览(26)
  • Killing LeetCode [55] 跳跃游戏

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 Ref Link:https://leetcode.cn/problems/jump-game/ Difficulty:Medium Tag:Array、Dynamic Programming Updated Date:2023-07-15 示例1: 示例 2:

    2024年02月16日
    浏览(26)
  • LeetCode-Java:55.跳跃游戏

    给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1: 示例 2: ①暴力递归法,将情况分解为当前元素是0则此路不通,非

    2024年02月05日
    浏览(31)
  • LeetCode刷题——55. 跳跃游戏(HOT100)

    ✊✊✊🌈大家好!本篇文章将较详细介绍贪心相关的题目 55. 跳跃游戏 ,提供两种解法。代码语言为: C++代码 😇。 🔒1、题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最

    2024年01月20日
    浏览(34)
  • 【算法题】动态规划中级阶段之跳跃游戏、最大子数组和、解码方法

    动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。 动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而

    2024年02月11日
    浏览(35)
  • 【算法题】动态规划中级阶段之最长回文子串、括号生成、跳跃游戏

    动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。 动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而

    2024年02月12日
    浏览(28)
  • 代码随想录:55. 跳跃游戏;45. 跳跃游戏 II

    给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 示例 2: 其实跳几步无所谓,关键在于可跳的覆盖范围! 不一定非要明确一次究竟跳几步,每次取最

    2023年04月11日
    浏览(32)
  • 算法 贪心2 || 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

    如果想到其实 最终利润是可以分解的 ,那么本题就很容易了! 如何分解呢? 假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。 相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。 此时就是把利润分解为每天为单位的维度,而不是从0天到第3天整体去

    2023年04月13日
    浏览(31)
  • Day32 贪心算法 part02 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II

    思路:计算每天的利润,利润如果为正,加到结果中去

    2024年01月19日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包