前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )

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

作者头像
韩曙亮
发布2023-03-30 18:28:06
3520
发布2023-03-30 18:28:06
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、跳跃游戏


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 的 , 从左到右跳跃 , 有方向性 ;

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

三、代码示例


代码示例 :

代码语言:javascript
复制
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);
    }
}

执行结果 :

代码语言:javascript
复制
最终能否达到终点 : true
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、跳跃游戏
  • 二、算法分析
  • 三、代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档