【Leetcode】55- 跳跃游戏

问题简述

给你一个非负整数数组 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 <= nums.length <= 10⁴
0 <= nums[i] <= 10⁵

思路分析

解法一:

该问题也是分阶段求解的,每个阶段的最优解是基于之前阶段的最优解(“最优子结构”),且当前阶段的解与之后阶段的解无关(“无后效性”),可以考虑采用动态规划求解。

原数组中每个下标对应的值表示的是 在该位置可以跳跃的最大长度 ,初始为nums[i],但我们的问题是:从第一个下标是否可以经过多次跳跃到达最后一个下标。因此对于每一个下标 i i i,不仅要考虑 原始的该位置可以跳跃的最大长度,还需要考虑从该下标之前的其他下标 j ( j < i ) j(j < i) jj<i开始跳跃,跳到当前位置 i i i 后还剩下的可以跳跃的最大长度。如果这个剩余的可以跳跃的最大长度大于当前下标原始的该位置可以跳跃的最大长度,则当前下标的从当前位置往后可以跳跃的最大长度 需要更新,反之不需要更新。

因此我们将每个阶段的状态定义为 从当前位置往后可以跳跃的最大长度,等于原始的该位置可以跳跃的最大长度从上一个位置跳跃至当前位置之后剩下可以跳跃的最大长度 这两者之间的最大值。如果当前状态值大于0,说明可以从当前位置继续往后跳跃。我们从第一个下标开始往后逐个下标进行判断,直到倒数第二个下标,如果其状态值大于0,说明可以到达最后一个下标,则最终的问题结果为true。
我们用状态数组dp来记录每个位置的可以跳跃的最大长度,则状态转移方程为:dp[i] = max(dp[i-1]-1,nums[i])。由于当前状态仅与上一阶段状态有关,使用滚动数组思想对dp数组降维,使用一个变量保存上一阶段状态即可。

具体代码实现见代码示例的 解法一。

解法二:

该问题具有“最优子结构”和“无后效性”,也具有“贪心选择性质”(即原问题的全局最优解可以通过每个子问题的局部最优解来逐步推断得到),因此也可以采用贪心算法求解。
问题:从第一个下标开始,是否可以经过多次跳跃到达最后一个下标。
其子问题为:从第一个下标开始,是否可以跳跃到当前下标之后的下标。可以通过求解经过每个下标时可到达的最远下标,比较是否大于当前下标来判断。每个子问题的解都基于前一个子问题的解。
因此我们遍历数组的每个下标,计算经过每个下标时可到达的最远下标,如果该值有小于等于当前下标的,说明不可到达比当前更远的下标了,对于原问题“是否可以到达最后一个下标”可以直接返回false。否则继续计算,当前下标的可到达的最远下标基于原本可跳跃最远下标和其前一个下标的可到达的最远下标进行比较取更大者进行更新,直到倒数第二个下标,若其可到达的最远下标仍然大于当前下标,说明其后一个下标(即最后一个下标)也是可以到达的,最终返回true。

动态规划算法与贪心算法的异同🌟
相同点:

都具有最优子结构,即原问题可以拆解为对多阶段的子问题求解,每个阶段的问题的最优解包含了子问题的最优解;

不同点:
  • 虽然都具有最优子结构,但子问题结构不同:
    • 动态规划的子问题有重叠,每个当前子问题与之前多个子问题有关(也可能只与上一个问题有关,与具体问题相关)。动态规划问题的求解分阶段进行(每个阶段对应一个子问题),每个阶段是由前几个可能的阶段转移而来的,这几个阶段之间会有重叠(对应了子问题的重叠),我们需要逐步求得所有阶段的状态(对应就是求解出所有子问题的最优解),直到求得最后阶段的状态(对应原问题的最优解)。因此动态规划问题的最优解来自于前几个子问题的最优解;
    • 贪心算法的子问题没有重叠,每个当前子问题只与其上一个子问题有关。当前问题的最优解就是基于前一个子问题的最优解得到的,这样逐个基于上一个子问题求解当前子问题的最优解,直到最后求解原问题,最终可以得到全局最优解。因此贪心算法的最优解来自于其前一个子问题的最优解;
  • 复杂度不同:
    • 动态规划算法的时间复杂度和空间复杂度都会更高,因为需要求解所有子问题并记录最优解;
    • 贪心算法的复杂度会更低;
联系:

可以使用贪心算法求解的问题,一定可以使用动态规划算法求解。只不过贪心算法会按一定贪心选择的策略总是直接选择其中的一种最优解,而不用像动态规划算法需要保存所有子问题的最优解。

代码示例

解法一:

class Solution:def canJump(self, nums: List[int]) -> bool:pre = nums[0]  # 记录前一个下标的 可以继续跳跃的最大长度for i in range(len(nums)-1):pre = max(pre - 1, nums[i])if pre <= 0:return Falsereturn True

解法二:

class Solution:def canJump(self, nums: List[int]) -> bool:longestind = 0 # 记录从下标0开始每经过一个下标时可跳跃到达的最远下标lens = len(nums)for i in range(lens-1):longestind = max(longestind, i + nums[i])if longestind <= i:return Falsereturn True 

测试用例1:
输入:nums = [2,2,0,1,1]
预期输出:true

测试用例2:
输入:nums = [2,0,1,0,1]
预期输出:false

复杂度分析

时间复杂度 O ( n ) O(n) O(n) 需要遍历一遍数组
时间复杂度 O ( 1 ) O(1) O(1) 仅用常数个变量存储

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能体Agent笔记

智能体的定义&#xff1a; 1. 可以感受环境中的动态条件 2. 能采取动作影响环境 3. 能运用推理能力理解信息&#xff0c;解决问题&#xff0c;产生推断&#xff0c;决定动作。 我个人觉得智能体是个饼&#xff0c;最核心的问题是&#xff0c;你如何解决大模型的幻觉问题&…

基于STM32的衣柜防潮系统设计的毕业论文

基于STM32的衣柜防潮系统设计的毕业论文 一、引言 随着生活品质的提升&#xff0c;人们对家居环境的舒适度要求越来越高。衣柜作为家居存储衣物的重要部分&#xff0c;其内部环境的湿度控制显得尤为重要。湿度过高可能导致衣物发霉、变质&#xff0c;严重影响衣物的使用寿命和…

[Android]常见的包管理方式

在Android开发中&#xff0c;包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式&#xff1a; 一、Gradle Gradle 是 Android 官方推荐的构建工具&#xff0c;几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等…

CMS垃圾回收器为什么被移除

CMS&#xff08;Concurrent Mark-Sweep&#xff09;垃圾回收器是Java虚拟机中一种以获取最短回收停顿时间为目标的收集器。CMS的主要特点是它允许垃圾回收线程与应用程序线程同时运行&#xff0c;尽可能减少应用程序的停顿时间。尽管它在多核处理器上表现良好&#xff0c;并且能…

笨方法自学python(三)-数学计算

数字和数学计算 这章练习里有很多的数学运算符号。我们来看一遍它们都叫什么名字 plus 加号-minus 减号/ slash 斜杠*asterisk 星号% percent 百分号< less-than 小于号greater-than 大于号< less-than-equal 小于等于号 greater-than-equal 大于等于号 print ("I …

JavaScript中,改变this的三种方法

在JavaScript中&#xff0c;this 关键字是一个特殊的变量&#xff0c;它在函数执行时确定了函数的上下文。通常&#xff0c;this 指向调用该函数的对象。但是&#xff0c;在某些情况下&#xff0c;我们可能需要改变 this 的指向。以下是三种常见的方法来改变 this 的指向&#…

优先队列全面讲解

主题&#xff1a; 优先队列是一种非常有用的数据结构&#xff0c;它让你能够管理一组数据&#xff0c;使得每次访问或移除数据时&#xff0c;总是得到当前集合中优先级最高&#xff08;或最低&#xff09;的那个元素。这个特性让优先队列非常适用于需要快速访问集合中最重要元…

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&am…

暗区突围哪里获得测试资格 暗区突围测试资格获取方法

在游戏业界的浩瀚星空中&#xff0c;《暗区突围》如同一颗璀璨新星&#xff0c;以其独树一帜的游戏模式和前所未有的沉浸式体验&#xff0c;迅速吸引了全球玩家的目光。它不仅仅是一款游戏&#xff0c;更像是一次对勇气、智慧与团队合作的深度探索。玩家在危机四伏的暗区中&…

程序人生 | 人生如棋,落子无悔

人生的开始&#xff0c;始于哭声&#xff0c;浮浮沉沉几十年。终了&#xff0c;一声长叹&#xff0c;在一片哭声中撒手离去。 人生的道路虽然漫长&#xff0c;但是关键就是那么几次机会的选择&#xff0c;可以决定此后几十年的光阴。 有个故事讲&#xff1a;古代有个人去砍柴…

.kat6.l6st6r勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在数字时代的洪流中&#xff0c;网络安全领域的新挑战层出不穷。近期&#xff0c;.kat6.l6st6r勒索病毒的出现再次打破了传统安全防护的界限。这种新型勒索病毒不仅具有高超的加密技术&#xff0c;更以其独特的传播方式和隐蔽性&#xff0c;给全球用户带来了…

干货教程【AI篇】| 目前全球最强AI换脸工具swapface详细图文教程及整合包下载

需要这个工具整合包的小伙伴可以关注一下文章底部公众号&#xff0c;回复关键词【swapface】即可获取。 从我们的链接下载&#xff0c;得到这个exe文件 双击运行即可进入安装界面 如下图所示已经在安装中啦 安装好之后我们根据上面的安装路径找到要执行的文件 双击红框中的…

三国杀背后的图形化编程 变量跟踪与吐槽的故事

在周末的公司里&#xff0c;卧龙凤雏等几位员工终于结束了加班任务&#xff0c;他们每个人都显现出些许疲惫之态&#xff0c;但心情还算较为轻松愉悦。突然&#xff0c;有人提议玩上几局三国杀&#xff0c;以此来让大家放松一下身心。于是乎&#xff0c;几人纷纷掏出手机&#…

Atcoder Beginner Contest353 A~E题解

文章目录 [A - Buildings](https://atcoder.jp/contests/abc353/tasks/abc353_a)[B - AtCoder Amusement Park](https://atcoder.jp/contests/abc353/tasks/abc353_b)[C - Sigma Problem](https://atcoder.jp/contests/abc353/tasks/abc353_c)[D - Another Sigma Problem](http…

MVC:一种设计模式而非软件架构

在软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;经常被提及&#xff0c;但很多人对其定位存在误解。本文将澄清一个常见的误区&#xff1a;MVC是一种设计模式&#xff0c;而非软件架构。 一、MVC简介 MVC&#xff0c;即模型&#xff08;Model&a…

24寸2K显示器 - HKC G24H2

&#x1f525;&#x1f5a5;️ 嘿&#xff0c;大家好&#xff01;今天&#xff0c;我要给大家介绍一款超棒的显示器——HKCG24H2&#xff01;这款显示器可是个全能选手&#xff0c;无论你是工作狂人还是游戏迷&#xff0c;它都能满足你的需求&#xff01; &#x1f60e;&#x…

ICode国际青少年编程竞赛- Python-2级训练场-基础训练3

ICode国际青少年编程竞赛- Python-2级训练场-基础训练3 1、 d Item.x - Dev.x Dev.step(d)2、 d Spaceship.x - Item.x Spaceship.step(d)3、 d Item.y - Dev.y Dev.step(d)4、 for i in range(4):Spaceship.step(2)d Item[i].x - Dev.xDev.step(d)Dev.step(-d)5、…

VMware 不能拍摄快照

问题&#xff1a; 拍摄快照后&#xff0c;会出现这个弹窗&#xff0c;然后虚拟机就直接自动退出了&#xff0c;还会弹出一个框&#xff1a; 解决方法&#xff1a; 我用的是 window11 和 VMware16.0.0 这是因为VM16与window11&#xff0c;二者之间版本不兼容问题&#xff0c;可…

【CTF Web】XCTF GFSJ0477 backup Writeup(备份文件+源码泄漏+目录扫描)

backup X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载&#xff1a; http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…

西蓝花病害检测(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.基于最新的YOLOv8训练的西蓝花病害检测模型&#xff0c;和基于PyQt5制作的可视化西兰花病害检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的三类西兰花病害&#xff1a;Downy Mildew, Black Rot, Bacterial Sp…