【算法】【递归与动态规划模块】跳跃游戏
admin
2024-01-29 04:36:08
0

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定数组arr,arr[i] 为k ,代表当前位置能够往前面跳跃1~k个单位,求到达arr尾部的最少步数。
如:
[3,2,3,1,1,4]
最少步数:从arr[0] 跳跃到arr[2]从arr[2]跳跃到中点一共两步。结果为2

解决方案

原问题
递归方法:
常规递归方法即可解答,定义递归函数f(arr, i) 表示从arr[i]出发到达arr终点的最少步数.
每一个状态遍历即可。
动态规划方法:
将常规递归方法转成动态规划即可,构建一维数组dp,dp[i]表示从arr[i] 到达终点所需最少步数.
最优解:
设计三个变量jump、cur、next。jump表示 到达当前位置已经跳了多少步了,cur表示当前位置只能跳一步的话能跳的最远距离、next表示当前位置跳两步的话最远能够跳多远。
对于每一个arr[i] 计算cur是否能够到达i,如果能到达,则不需要增加步数,查看到达的地方是否能够更新next。如果不能到达,则需要增加步数,cur变成next,next持续更新。详情见代码,原理见思考。

代码编写

java语言版本

原问题:
经典递归版本:

     /*** 二轮测试:递归方法* @return*/public static int jumpCp1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}return processCp1(arr, 0);}private static int processCp1(int[] arr, int i) {// -1表示跳不过去int res = Integer.MAX_VALUE;if (i >= arr.length) {// 超出去了,无法达到,直接返回最大值return Integer.MAX_VALUE;}if (i == arr.length-1) {// 已经到了,返回0步即可return 0;}int step = arr[i];for (int j = 1; j <= step; j++) {res = Math.min(res, processCp1(arr, i+j));}return res == Integer.MAX_VALUE ? -1 : res + 1;}

经典动态规划版本:

    /*** 二轮测试:动态规划* @return*/public static int dpCp1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int[] dp = new int[arr.length];dp[arr.length-1] = 0;for (int i = arr.length-2; i >= 0; i--) {int step = arr[i];int min = Integer.MAX_VALUE;for (int j = 1; j <= step; j++) {min = Math.min(min, dp[i+j]);}dp[i] = min + 1;}return dp[0];}

最优解:

    /*** 最优解* 时间 o(n) 空间 O(1)* @param arr* @return*/public static int superCp1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int jump = 0;// 当前所在位置能够跳的最远距离int cur = 0;// 下一跳的位置的最大范围int next = 0;for (int i = 0; i < arr.length; i++) {if (cur < i) {// 说明当前位置到不了了jump ++;// 跳到下一跳cur = next;}next = Math.max(next, i + arr[i]);}return jump;}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

这道题是一道单路线型的递归,并且很容易想到,这里就不解释了,主要思考一下最优解的优化点在什么地方
首先最优解的空间复杂度O(1),时间O(N), 递归和动态规划都没有达到这个复杂度。

首先有一个重要的指标就是,当cur小于i的时候需要跳跃了,这个时候跳跃数+1,cur=next,这里next已经遍历出了cur到i之间每一个位置能够到达的最远距离,所以这里cur跳到的位置就是能够跳到最远距离的那个位置,但是我们不关心,我们只关心下一跳能够跳到的最远距离,所以i只会递增,此时cur和i之间的位置不需要再遍历了,因为cur和i之间的距离没有一个能够跳的不cur更远的,但是递归就会暴力的尝试每一种情况导致了时间复杂度增加了一个维度。
这两种解法之间的不同在于角度,递归关心的是步数,而最优解将眼光投到了每一步中能够跳的最远位置。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!

相关内容

热门资讯

A股异动丨避险情绪升温促金银价... A股市场黄金股强势,其中,四川黄金、招金黄金涨停,山金国际涨超6%,中金黄金、西部黄金涨超4%。 消...
服刑7年获判无罪,女商人林惠荣... 澎湃新闻记者 王选辉 1月19日,澎湃新闻从福建女商人林惠荣处了解到, 其向法院申请的国家赔偿,经漳...
康骨堂 骨质增生怎么保养 骨质增生(骨关节炎)可以通过多种方式进行保养和治疗,常见方法包括生活方式调整、物理疗法、非甾体抗炎药...
原创 中... 1月15日,中银基金发布公告称,联席投资总监(固定收益)邢科因个人原因离任。 公开资料显示,邢科于...
商汤在厦门成立智能开发公司 注... 天眼查工商信息显示,1月19日,厦门商汤智能开发有限公司成立,法定代表人为马堃,注册资本3000万美...
马斯克:AI5芯片设计基本完成... 近期,特斯拉CEO埃隆·马斯克密集披露芯片战略相关信息,这表明特斯拉正在调整其AI芯片与超级计算平台...
“俩西红柿要10块钱”?专家:... “俩西红柿要10块钱”“鸡蛋都快配不上西红柿啦”……近段时间,全国多地西红柿价格明显上涨,引发市场高...
圣贝拉集团今日股价涨超12%,... 1月19日,全球家庭护理行业龙头圣贝拉集团(股票代码:2508.HK)发布公告,正式宣布与服务机器人...
刘世锦:建议实施进出口基本平衡... 1月17日,中国环境与发展国际合作委员会中方首席顾问、国务院发展研究中心原副主任刘世锦在第二十七届北...
阳光电源逐光出海,锚定全球储能... 全球能源转型浪潮澎湃,储能作为构建新型电力系统的关键支撑,其战略地位日益凸显。在这场关乎未来能源格局...
封关整一个月,海南卖爆了 1 2025年12月18日,海南自贸港全岛正式封关。 今天是2026年1月19日,海南封关整整一个月...
容积率下调,体量23万㎡!福州... 海西房产网(微信公众号:fjhxfcw)消息:为传承弘扬“中国福州国际招商月”思想精髓,福州市招商办...
比格比萨赴港IPO,创始人赵志... 瑞财经 严明会 1月16日,比格餐饮国际控股有限公司(以下简称:比格比萨)递交招股书,冲击港股IPO...
罗永浩被禁言后现身颁奖典礼,领... 1月19日,罗永浩于谦拒领终身成就奖的相关话题登上热搜。 1月18日,在B站年度百大UP主颁奖典礼...
原创 G... 如果说欧盟是个戏班子,每次开会就像上演一场戏,那G7就更像是个马戏团,所有的成员都是戏精上身,开会时...
原创 赚... 最近,关于俄罗斯暂停对中国电力出口的消息引发了广泛的讨论。西方媒体迅速抓住这个机会,宣称中俄合作出现...
原创 指... 现阶段的市场已经进入到“降温”的调整时期,针对A股“易跌难涨”的特性,这个位置千万不要“空手接白刃”...