首页 > 其他分享 >55. 跳跃游戏

55. 跳跃游戏

时间:2024-11-10 21:34:28浏览次数:1  
标签:index process return 游戏 nums 55 next int 跳跃

  1. 题目链接

  2. 解题思路

    • 方法一:(注:这种方法过不了,提供一种思路,如果只想过题,可直接跳转到方法二)自顶向下的动态规划,先写暴力递归过程,然后再直接加缓存表即可。

      • bool process(nums, index, next)

        • nums:固定参数
        • index:当前来到的下标
        • next:能够走到的最远的下标
      • 来到index,怎么考虑?举个例子,假设index为3,next是5,代表我现在在3号下标,我最远能够走到5,那么我要怎么走?

        • 我可以走到4,然后后续接着走int res = process(nums, 4, 4 + nums[4])
        • 我也可以走到5,然后后续接着走int res = process(nums, 5, 5 + nums[5])
        • 很明显,就是一个for循环。注意到,只要一个返回了true,那么就不用接着往下走了,
      • 代码一

        class Solution {
        public:
        
            // index是当前来到的位置,next是能够到达的位置
            // 数据情况   index <= next
            bool process(const vector<int> &nums, int index, int next) {
                if (next >= nums.size() - 1) {    // 注意题目返回条件,到达最后一个下标即可
                    return true;
                }
                // 下一步我走哪?
                for (int i = index + 1; i <= next; ++i) {
                    int res = process(nums, i, i + nums[i]);
                    if (res) {     // 只要走成功了,就不用再试了
                        return true;
                    }
                }
                // 上面所有路都走不了
                return false;
            }
            bool canJump(vector<int>& nums) {
                return process(nums, 0, nums[0]);
            }
        };
        

        结果

        • 下面直接加缓存,缓存怎么理解?我们可以看见主函数调用了process(nums, 0, nums[0]),也就是说,这个结果和传入的参数有关(这不是废话吗?),具体到递归函数里面,nums是不会变的,可变的就是两个参数,所以,我们可以用表记下来,比如,当index = 2, next = 4时,结果是什么
          • 为什么要记下来?因为有重复的结果,
            • 例如[2, 2, 1, ....],当前来到index为0,next为2,
              • 你可以选择走到1,那么就调用process(nums, 1, 3),然后接下来怎么走?你可以选择走到2,那么就调用process(nums, 2, 3)
              • 你也可以选择走到2,那么就调用process(nums, 2, 3),可以看到,和上面重复了。
          • 直接加缓存这种,其实就是「动态规划」,只不过是自顶向下的动态规划。
      • 代码二

        class Solution {
        public:
        
            // index是当前来到的位置,next是能够到达的位置
            // 数据情况   index <= next
            bool process(const vector<int> &nums, int index, int next, vector<vector<int>> &dp) {
                if (next >= nums.size() - 1) {    // 注意题目返回条件,到达最后一个下标即可
                    return true;
                }
                if (dp[index][next] != -1) {     // 因为我初始化是-1,不等于-1说明算过了
                    return dp[index][next];
                }
                // 下一步我走哪?
                for (int i = index + 1; i <= next; ++i) {
                    int res = process(nums, i, i + nums[i], dp);
                    if (res) {     // 只要走成功了,就不用再试了
                        dp[index][next] = 1;    // 1表示true
                        return true;
                    }
                }
                // 上面所有路都走不了
                dp[index][next] = 0;
                return false;
            }
            bool canJump(vector<int>& nums) {
                int n = nums.size();
                vector<vector<int>> dp(n, vector<int>(n, -1));
                return process(nums, 0, nums[0], dp);
            }
        };
        
        • 结果

          • 很可惜,爆内存了(那你说这么干嘛?这种暴力递归的能力很重要,很多动态规划就是这样出来的),那么接下来看第二种方法。
    • 方法二:其实我们并不需要把所有的「路」都走一遍,我们只需要用一个变量记住,我们「最远」能跑到哪里就行了

      • 例如nums = [2,3,1,1,4],我们初始在0号位置,我们最远能跑到哪里去?next = 2 + 0,然后我们来到1号位置,我们能来吗?能来,因为next是2,然后我们最远能跑到哪里去?原来是2,现在是3 + 1,所以要更新next,直接看代码,更加清晰。

      • 代码

        class Solution {
        public:
            bool canJump(vector<int>& nums) {
                int next = nums[0];
                int n = nums.size();
                for (int i = 1; i < n; ++i) {
                    if (i > next) {    // 不好意思   走不到i  直接返回false
                        return false;
                    }
                    next = max(next, i + nums[i]);
                    // if (next >= n - 1) {    // 提前结束   加了反而变慢了。。数据问题
                    //     return true;
                    // }
                }
                return true;
            }
        };
        

标签:index,process,return,游戏,nums,55,next,int,跳跃
From: https://www.cnblogs.com/ouyangxx/p/18538517

相关文章

  • 如何使用Yolov8训练——胸部肺结节目标检测数据集 1个类别 精确度P:0.655,召回率R:0.575,m
    同时yolov8n训练100个epoch检测结果如下精确度P:0.655,召回率R:0.575,mAP50:0.639,map50-95:0.289数据集可直接使用,未做任何数据增强等预处理胸部肺结节目标检测数据集该数据集已经包括1个类别分别是:target总计图片4882张图像,分辨率是1024x1024像素数据集是txt格式数......
  • P2123 皇后游戏 / [USACO12JAN] Mountain Climbing S / P1248 加工生产调度 题解
    P2123皇后游戏/[USACO12JAN]MountainClimbingS/P1248加工生产调度先来看P2123。我们把这个特别重要的公式打出来:\[c_{i}=\begin{cases}a_{1}+b_{1}&,i=1\\\displaystyle\max\left\{c_{i-1},\sum_{j=1}^{i}a_{j}\right\}+b_{i}&,2\leqi\leqn\end{......
  • node.js毕设游戏代练系统(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着电子竞技行业的快速发展,游戏代练已经成为许多游戏玩家提升游戏技能、快速提升段位的一种常见方式。现有研究主要集中在电子竞技行业的发展趋势、市......
  • [NOIP2012 提高组] 国王游戏 题解
    [NOIP2012提高组]国王游戏典贪心。设当前点为\(i\),\(\prod_{k=0}^{i-1}a_k\)为\(x\),则对于\(i,j\)两点的答案:(为了方便,记\(i+1=j\))\[\mathit{res}_1=\max\bigg(\dfracx{b_i},\dfrac{xa_i}{b_j}\bigg)~;\]若交换,则:\[\mathit{res}_2=\max\bigg(\dfracx{b_j},\dfrac{......
  • 【最新原创毕设】基于移动端的助农电商系统+08655(免费领源码)可做计算机毕业设计JAVA、
    基于移动端的助农电商系统的设计与实现摘要近年来,电子商务的快速发展引起了行业和学术界的高度关注。基于移动端的助农电商系统旨在为用户提供一个简单、高效、便捷的农产品购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融合,从而提升......
  • [luogu2123] 皇后游戏
    那她既然都说到老国王了,那肯定就是贪心了。先声明两个引理:引理1:若\(\max(c,a)<\max(c,b)\)时,定有\(a<b\)。引理2:\(\max(a,b)-a-b=-\min(a,b)\)。证明就不说了,非常好证。考虑\(i,j\)两大臣孰先孰后,假如\(i\)在前面更优,\(x\)表示所有在他们前面的大臣的\(\suma\)......
  • 在鸿蒙NEXT中开发一个2048小游戏
    本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。  首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺寸的组......
  • 如何简化App Store提现?——作为游戏开发者的跨境收款体验分享
    目录如何简化AppStore提现?——作为游戏开发者的跨境收款体验分享跨境收款常见的几个问题使用万里汇收款后的体验1.结算流程简单,到账更快2.多场景收付更灵活3.多种支付方式支持使用后的效果:资金管理更高效个人建议如何简化AppStore提现?——作为游戏开发者的跨......
  • 电脑提示xinput1_3.dll丢失怎么办?游戏DLL修复方法详解
    xinput1_3.dll是一个动态链接库(DLL)文件,它在Windows操作系统中扮演着重要的角色,特别是在处理游戏控制器和其他输入设备的交互方面。这个文件是MicrosoftDirectX软件包的一部分,DirectX是微软公司开发的一个多媒体编程接口集,广泛应用于PC游戏开发中,以实现高效的图形渲染、音频处......
  • win10玩游戏找不到d3dx9_43.dll丢失怎么解决,d3dx9_43.dll丢失五种解决方法
    d3dx9_43.dll是MicrosoftDirectX9的一个关键组件,具体而言,它是一个动态链接库(DLL)文件。DirectX是由Microsoft开发的多媒体编程接口,旨在优化Windows操作系统上游戏和多媒体应用程序的性能,特别是图形和声音功能。d3dx9_43.dll文件包含了Direct3D9的一些关键功能,如3......