78、贪心-跳跃游戏

思路

方法1: canJump01 - 使用递归(回溯法)

这个方法是通过递归实现的,它从数组的第一个位置开始,尝试所有可能的跳跃步数,直到达到数组的最后一个位置或遍历完所有的可能性。

思路:

  • 如果数组为空或者长度为0,直接返回 false
  • 从数组的第一个位置(index = 0)开始调用递归函数 process
  • 递归的终止条件是,如果当前的 index 等于 N-1(数组的最后一个位置),则返回 true
  • 在当前位置,根据该位置的数字决定可以跳跃的步数范围,递归地尝试每一种跳跃步数。
  • 如果任何一种跳跃方式可以到达最后位置,则返回 true

缺点:

  • 这种方法的时间复杂度非常高,因为它尝试了所有可能的路径,可能导致指数级的计算量。

方法2: canJump02 - 使用动态规划

这个方法使用了动态规划(DP)来减少重复计算,提高效率。

思路:

  • 初始化一个布尔型的数组 dp,其中 dp[i] 表示是否可以从起始位置跳跃到位置 i
  • dp[0] 初始化为 true,因为起始位置总是可达的。
  • i = 1 开始遍历数组,对于每个位置 i,检查所有之前的位置 j,看是否存在一个 j,使得从 j 跳跃到 i 是可行的(即 dp[j]truej + nums[j] 大于等于 i)。
  • 如果找到这样的 j,则设置 dp[i] = true 并中断当前循环。

优点:

  • 时间复杂度为 O(n^2),空间复杂度为 O(n)。

方法3: canJump - 贪心算法

使用贪心算法解决问题,思路更为直接和高效。

思路:

  • 维护一个变量 maxReach 来存储从起点开始可达的最远位置。
  • 遍历数组,对于每个位置 i,首先检查 i 是否超过了之前的 maxReach。如果超过,则说明无法到达当前位置,返回 false
  • 然后更新 maxReachmax(maxReach, i + nums[i])
  • 如果在任何时刻 maxReach 大于等于数组的最后位置,直接返回 true

优点:

  • 时间复杂度为 O(n),空间复杂度为 O(1),是三种方法中最优的。

代码如下:

class Solution {public boolean canJump01(int[] nums) {if (nums==null||nums.length==0){return false;}return process(nums,0,nums.length);}private boolean process(int[] nums, int index, int N) {if (index==N-1){return true;}int num=nums[index];boolean ans=false;//当前节点跳 1-num 步for (int i = 1; i <=num; i++) {ans=ans||process(nums,index+i,N);}return ans;}public boolean canJump02(int[] nums){if (nums==null||nums.length==0){return false;}int N=nums.length;boolean[] dp = new boolean[N];dp[0] = true; // 起点是可达的for (int i = 1; i < nums.length; i++) {// 初始化当前位置为不可达dp[i] = false;// 遍历到当前位置之前的所有位置for (int j = 0; j < i; j++) {// 如果位置 j 可达,并且从 j 跳跃足够远以到达 iif (dp[j] && j + nums[j] >= i) {dp[i] = true;break; // 找到一个可达的位置后,无需继续检查}}}return dp[N-1];}//假设从 0 跳 最远跳到i位置 那说明 0-i都是可达的,所以只需要关心每次跳多远即可//然后再次从1 位置尝试跳最远  如果1 >max 说明在0位置跳的时候无法跳到1public boolean canJump(int[] nums) {int maxReach = 0; // 可达的最远位置for (int i = 0; i < nums.length; i++) {// 如果当前位置超过了最远可达位置,则无法继续if (i > maxReach) {return false;}// 更新最远可达位置maxReach = Math.max(maxReach, i + nums[i]);// 如果最远可达位置已经超过或到达数组的最后一个位置if (maxReach >= nums.length - 1) {return true;}}// 结束循环后,如果还没返回true,则说明最后位置不可达return false;}
}

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

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

相关文章

千帆起航、芯聚未来——鸿蒙与集成电路产教融合人育人研讨活动成功举办

4月24日&#xff0c;“千帆起航、芯聚未来”——鸿蒙与集成电路产教融合人育人研讨活动在上海顺利举行&#xff0c;本次活动由华为云计算技术有限公司、上海恒驰信息系统有限公司、上海荟诚信息系统有限公司和上海青软晶睿微电子科技有限公司联合举办&#xff0c;汇聚了来自教育…

探索未来道路:智慧高速系统架构的革命性进步

随着科技的飞速发展&#xff0c;智慧高速系统架构正在成为道路交通领域的一项重要创新。这一系统结合了先进的信息技术和智能化设备&#xff0c;为高速公路提供了全新的管理和服务模式&#xff0c;极大地提升了交通运输效率和安全性。本文将深入探讨智慧高速系统架构的革命性进…

判断100以内的素数(筛选法)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int n 0;int a[101] { 0 };//循环填充数组a…

利用Wget批量下载网页链接中的数据

1、电脑下载安装好Wget程序&#xff0c;具体操作流程可参照&#xff1a; wget 的安装与使用&#xff08;Windows&#xff09;_wget windows-CSDN博客https://blog.csdn.net/m0_45447650/article/details/125786723?ops_request_misc%257B%2522request%255Fid%2522%253A%25221…

算法效率的判断及一些典型例题的讲解

一.算法效率 1.用处&#xff1a;判断算法的好坏&#xff0c;好的算法应该是高效的 2算法效率取决于时间复杂度和空间复杂度 <1>时间复杂度 1.1概念&#xff1a;算法中基本操作的执行次数就是算法的时间复杂度 1.2表示&#xff1a;大O的渐进表示法&#xff0c;例如O(N)…

区块链论文总结速读--CCF B会议 ICDCS 2023 共8篇

Conference&#xff1a;IEEE 43rd International Conference on Distributed Computing Systems (ICDCS) CCF level&#xff1a;CCF B Categories&#xff1a;Computer Architecture/Parallel and Distributed Computing/Storage Systems 计算机体系结构/并行与分布计算/存储…

如何用OceanBase的 Load Data 导入CSV文件

0 前言 CSV文件&#xff08;Comma-Separated Values&#xff0c;字符分隔值&#xff09;是一种普遍采用的数据存储格式&#xff0c;有不少企业和机构都用它来进行数据的管理和存储。身为开发者&#xff0c;您可能经常遇到这样的需求&#xff1a;需要将CSV的数据导入OceanBase数…

3-2 STM32c8t6实现流水灯

实物接线如下&#xff1a; 软件代码 #include "stm32f10x.h" // Device header #include "delay.h" int main(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_Init…

盘点:国内物流装备商的出海策略和战果

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 随着物流行业的快速发展和全球市场的不断开放&#xff0c;越来越多的物流装备企业开始将目光投向海外市场&#xf…

安卓中级控件(图形、选择按钮、文本输入、对话框)

图形定制 图形Drawable Android把所有能够显示的图形都抽象为Drawable类&#xff08;可绘制的&#xff09;。这里的图形不止是图片&#xff0c;还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下&#xff0c;其中drawable目录一般保存描述性…

spring-boot示例

spring-boot版本&#xff1a;2.0.3.RELEASE 数据库: H2数据库 &#xff08;嵌入式内存性数据库&#xff0c;安装简单&#xff0c;方便用于开发、测试&#xff0c;不适合用于生产&#xff09; mybatis-plus框架&#xff0c;非常迅速开发CRUD

【LAMMPS学习】八、基础知识(5.3)Body particles体粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…