LeetCode55题:跳跃游戏(原创)

【题目描述】

       给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
 
提示:
1)1 <= nums.length <= 104
2)0 <= nums[i] <= 105。

【解题代码】

class Solution {
    public boolean canJump(int[] nums) {
        boolean[] mark = new boolean[nums.length];
        return jump(nums, 0, mark);
    }

    public boolean jump(int[] nums, int n, boolean[] mark) {
        mark[n] = true;
        if (n > nums.length - 2) return true;
        for (int i = 1; i <= nums[n]; i++) {
            if (!mark[n + i] && jump(nums, n + i, mark))
                return true;
        }
        return false;
    }
}

【解题思路】

        拿到题目,首先想到就是采用递归的方式不断地尝试下一步。按照这个思路很快完成代码编写

class Solution {
    public boolean canJump(int[] nums) {
        return jump(nums, 0);
    }

    public boolean jump(int[] nums, int n) {
        if (n > nums.length - 2) return true;
        for (int i = 1; i <= nums[n]; i++) {
            if (jump(nums, n + i))
                return true;
        }
        return false;
    }
}

代码很容易编写,但这种简单粗暴的方式,性能肯定不过关,一提交,结果不出所料

分析原因,感觉问题应该出现在重复计算的问题,即几次的跳跃一旦落到同一个格子里,之后的结果肯定是一样的,如果避开标记好跳过的格子,性能应该会大大提高,快速修改代码,并提交成功

【解题步骤】

  1. 定义一个函数,从某个下标开始,往后跳,看最终是否能跳到最后一格
    public boolean jump(int[] nums, int n, boolean[] mark) {
        // 如果当前下标大于等于数字为不下标返回true
        if (n > nums.length - 2) return true;
        // 标记第n个下标已经跳过
        mark[n] = true;
        // 从第n个下标开始,从1步到最大步数依次递归跳跃计算
        for (int i = 1; i <= nums[n]; i++) {
            // 如果当前下标没有跳过,则递推进行跳跃尝试
            if (!mark[n + i] && jump(nums, n + i, mark))
                return true;
        }
        // 所有步数都尝试不成功,最后返回失败
        return false;
    }

  2. 定义一个数组,标记所有下标是否跳过
    boolean[] mark = new boolean[nums.length];
  3. 从下标0开始递归跳跃,并返回最终结果
     return jump(nums, 0, mark);

【思考总结】

  1. 递归算法比较简单,但会有重复计算的陷阱,之前动态规划算法里也提到过了;
  2. 官方的题解算法更简单,性能更好,大家也可以看看;
  3. LeetCode解题之前,一定不要看题解,看了就“破功”了! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s网络详解

一、Kubernetes网络基础 1、kubernetes的网络层级 节点网络&#xff1a;集群宿主机节点间的网络通信&#xff0c;并且负责打通与集群外部的通讯。pod网络&#xff1a;为集群上的pod提供网络&#xff0c;通过CNI网络插件来完成&#xff0c;如Fannel、Calico、Cilium等。servic…

小米汽车值得去吗?最终拒了 offer。

车企选择 今天逛某职场 App 时&#xff0c;无意间看到一篇寻求 offer 抉择意见的帖子&#xff1a; 这位同学刚从加班闻名&#xff08;但 CEO 强调既学华为狼性&#xff0c;也学华为分配&#xff09;的理想汽车离职。 经过了 6 轮面试&#xff0c;收到了小米 offer&#xff0c;但…

【VTKExamples::Meshes】第十期 Decimation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例Decimation,并解析接口vtkDecimatePro,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO…

[计算机效率] 时间记录工具:ManicTime

3.24 时间记录工具&#xff1a;ManicTime ManicTime是一款数据收集软件&#xff0c;主要用于记录电脑上各种软件使用所花费的时间以及电脑闲置的时间。用户还可以定制记录某一时间段内的系统活动。 数据收集&#xff1a;ManicTime能够静默运行于后台&#xff0c;自动跟踪并收…

如何检测和避免线程死锁?

在日常开发中涉及到多线程开发时候就很容易会产生死锁 what: 什么是线程死锁? 线程死锁是指两个或两个以上的线程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞现象。当这些线程互相持有对方所需要的资源时&#xff0c;会互相等待对方释放资源&am…

ssm054班主任助理系统的设计与实现+jsp

班主任助理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本班主任助理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

mybatis的一对多

业务&#xff1a;通常主表从表 查询&#xff0c;一对多关系&#xff0c;通常是先查主表&#xff0c;然后拿主表的 关联字段与从表关联。在代码中 通常用for 循环等方法给 从表的数据赋值&#xff0c;很麻烦&#xff0c;&#xff0c;&#xff0c;很麻烦。。。。 用mybatis的…

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

Win11 使用 WSL2 安装 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu 段子手168 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 启用适用于 Linux 的 Windo…

小程序视频怎么保存到本地

掌握视频下载高手的妙招&#xff0c;轻松将微信小程序中的视频内容保存到本地&#x1f4e5;。遵循本文步骤&#xff0c;无需繁琐操作&#xff0c;快速实现视频下载&#xff0c;享受随时观看的便捷。 下载高手我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s…

#381. 四边形继承练习

太爽了 甚至还现学了叉积判断线段是否相交和求面积的方法 先给出我的代码&#xff1a; #include <iostream> #include <vector> #include <iomanip> #include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码 const double EPS 1…

儿童护眼台灯怎么选?五款必选的高口碑护眼台灯推荐

儿童台灯&#xff0c;想必大家都不会陌生了&#xff0c;是一种学生频繁使用的小灯具&#xff0c;一般指放在桌面用的有底座的电灯。随着近年来儿童青少年的视力急速下滑&#xff0c;很多家长都会选择给孩子选择一款合适的护眼台灯&#xff0c;以便孩子夜晚学习能有个好的照明环…

数据结构—顺序表实现通讯录

在上一节我们基本了解了顺序表的基本知识&#xff0c;接下来我们就用顺序表来实现一下通讯录。 一、基于动态顺序表实现通讯录 1.1 功能介绍 1. 能够保存用户信息&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;地址等 2. 添加联系人信息 3. …

零基础使用FlexLua打造LoRa无线气体流量计,硬件轻松快速开发。

在工业领域&#xff0c;对气体流量进行准确监测和管理是保障生产安全和提高效率的重要环节。而LoRa&#xff08;长距离低功耗无线技术&#xff09;作为一种适用于远距离、低功耗的通信技术&#xff0c;为无线传感器网络的建设提供了可靠的解决方案。结合气体流量传感技术&#…

【JS】querySelectorAll和getElementsByClassName

现有一段代码&#xff0c;li的类名均为item&#xff0c;有一按钮可动态添加类名为item的li。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

润乾报表平台 InputServlet 任意文件读取漏洞复现

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具&#xff0c;支持对J2EE系统的嵌入式部署&#xff0c;无缝集成。服务器端支持各种常见的操作系统&#xff0c;支持各种常见的关系数据库和各类J2 EE的应用服务器&#xff0c;客户端采用标准纯html方式展现&#xff0c;支持…

1000BASE-SX VS 1000BASE-LX SFP光模块

SFP光模块是一种小型可插拔光模块&#xff0c;用于支持1G速率的光纤通信&#xff0c;有多种不同类型。市场上使用较广泛是1000BASE-SX和1000BASE-LX SFP光模块。在本文中&#xff0c;飞速&#xff08;FS&#xff09;将对这两种LC SFP光模块进行简要介绍。 什么是1000BASE-SX S…

3dmax制作小熊猫的基本流程

1.透视图插入面片&#xff0c;改高度宽度&#xff0c;把参考图放进面片里。 2.角度捕捉切换&#xff0c;角度改为90 3.shift旋转&#xff0c;旋转面片&#xff0c;复制一个出来 4.在前视图&#xff0c;把参考图片中的正式图小熊猫的一半的位置&#xff08;可以是眼睛&#x…

Android Studio引入framework.jar包

一. 前言 Android Studio 引入framework.jar 步骤&#xff0c;记录笔记 Android源码编译产生的framework.jar 在不同的版本上生成路径是不同的 Android N/O: 7 和 8 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar Android P/Q: 9 和 10 out/s…