跳跃游戏(一,二)

【编程算法】跳跃游戏ⅠⅡⅢ(Python解法) 写这篇文章源于之前4.10做的字节跳动的笔试,第二道编程题就是跳跃游戏类,可以说和牛客或者力扣上边的解题做法是完全一样的,可惜当时我才刚开始学习算法。深入了解该类型后发现真的很有意思,这篇文章给大家分享一下本人的思路及解题方法,主要将该类题分为三种类型(主要是后两种问题),算是系统性地阐述了该类问题的解法,假如把三种类型题目搞懂,我觉得在遇到该类问题便能做到得心应手了。 前言 文章分为... 一、贪心算法 看到能否走完,走得更远等题目,一般考虑动态规划和贪心算法,这题没有那么明显的 二. 阅读详情

跳跃游戏二
题目:

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

你的目标是到达最后一个下标,并且使用最少的跳跃次数。

例如:

A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为2。(先跳跃111 步,从下标0 到1,然后跳3 步,到达最后一个下标。一共两次)

输入格式

第一行输入一个正整数 n(1≤n≤100)n,接下来的一行,输入 n 个整数,表示数组 A。

输出格式

最后输出最少的跳跃次数。

样例输入
5
3 1 1 1 1
样例输出
2
代码:
import java.util.*;

public class Main{
	public static void main(String args[])
    {
		Scanner in =new Scanner(System.in);
		int num=in.nextInt();
		int []a=new int[num];
		int []dp=new int[num];//dp表示的是从起点跳到当前位置所需的次数
		for(int i=0;i<num;i++) {
			a[i]=in.nextInt();
			dp[i]=0;
		}
		for(int i=0;i<num;i++) {
			for(int j=1;j<=a[i];j++) {
				if(i+j<num) {
					if(dp[i+j]<=0) {
					dp[i+j]=dp[i]+1;
				}else if(dp[i]+1<dp[i+j]) {
					dp[i+j]=dp[i]+1;
				}
				}
			}
		}
		System.out.println(dp[num-1]);
    }
}
这个程序通过基本的测试用例也都是没问题,但是它还是存在这一些问题。。。。。
本来没有发现,其实这个程序是有错误的,当我们输入的数组中存在0的时候怎么办,这种情况没有考虑到。。。
例如当我们输入的数组为:{1,0,2,3,4}时,这时从第二个节点是不能在进行跳跃时,此时这个数组是无解的,这种情况也必须考虑到。
所以需要进行一下更正:
在第一个for循环中,i<num的判断条件,加一个与 dp[i]!=0;这就是说明,当它不能从第一个节点跳过去时,后面的节点就不需要进行判断了,
我们判断的节点,必须是可以从第一个节点跳过去的才可以。
但是当我们加入这个与的判定条件时,我们又会发现问题,因为我们默认的dp数组都是0,当我们加入这个判断条件时,我们会发现第一个节点,
就是不能通过for循环的,所以我们还需要做出一些改变。就是当判断第一个节点时,我们先修改dp的值,然后判断完之后,我们在改回来。。。
这个方法可能挺不好的,但是目前我还没有想到更好的解决办法,所以先这样进行訂正,以后想到更好的方法,在进行修改。
修改之后代码如下:
import java.util.*;

public class Main{
	public static void main(String args[])
    {
		Scanner in =new Scanner(System.in);
		int num=in.nextInt();
		int []a=new int[num];
		int []dp=new int[num];//dp表示的是从起点跳到当前位置所需的次数
		for(int i=0;i<num;i++) {
			a[i]=in.nextInt();
			dp[i]=0;
		}
		dp[0]=1;
		for(int i=0;i<num&&dp[i]!=0;i++) {
			dp[0]=0;
			for(int j=1;j<=a[i];j++) {
				if(i+j<num) {
					if(dp[i+j]<=0) {
					dp[i+j]=dp[i]+1;
				}else if(dp[i]+1<dp[i+j]) {
					dp[i+j]=dp[i]+1;
				}
				}
			}
		}
		if(dp[num-1]<=0)System.out.println("无解,跳不到最后一个节点 ");
		else System.out.println(dp[num-1]);
    }
}
跳跃游戏一:
其实也可以用这个方法来解,只需要将上面的输出做一个判断就好,如果dp[num-1]>0 则为true,否则为false。但是还有一点要注意,就是当只输入一个元素时,
对跳跃游戏一来说可能有些问题,因为此时dp[0]=0,判断是false的,但是结果应该为true,所以这时只要修改一下dp[0]=0 的位置就好。
但是事实上跳跃游戏有更好的解决方法:基于贪心算法的

问题:

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

请确认你是否能够跳跃到数组的最后一个下标。

例如:A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true;

A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false。

输入格式

第一行输入一个正整数 n(1≤n≤500)n(1 \leq n \leq 500)n(1≤n≤500),接下来的一行 nnn 个整数,输入数组 AiA_iA​i​​。

输出格式

如果能跳到最后一个下标,输出true,否则输出false。

样例输入
5
2 0 2 0 1

样例输出
true
代码:
import java.util.Scanner;

public class Main{  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        int n = sc.nextInt();  
        /* 
         * 思路:贪心算法; 
         * 从第一个数开始, 寻找可以一个可以跳最远的点; 
         * 例1:3 1 2 4 1 0 0 
         * 1.从第一个位置0,可以跳到位置1和位置2和位置3; 
         * 2.如果跳到位置1,那么最远就可以跳到位置(1+1); 
         * 3.如果跳到位置2,那么最远就可以跳到位置(2+2); 
         * 4.如果跳到位置3,那么最远就可以跳到位置(3+4); 
         * 5.故选择跳到位置3 ,重复1.2.3步; 
         *  
         * 算法分析: 
         * 1.如果选择跳到位置3 ,就无法跳到位置2和位置3, 那么会不会因此错过最优解? 答:不会! 
         * 2.因为任意位置1和位置2能到达的位置, 位置3都可以到达; 
         * 3.故不会错过最优解; 
         */  
        int[]a = new int[n];  
        for(int i= 0 ;i< n ;i++) {  
            a[i] = sc.nextInt();  
        }  
        int i;  
        int l;  //左边界       控制搜索的起始位置  
        int r;  //右边界       控制搜索的终止位置  
        for( i= 0 ;i< n && a[i]!= 0 ;) { //当a[i]==0 时 , 该位置为可到达的最远位置  
            r = i + a[i];  
            l = i + 1;   
            for(int j= i+1 ;j< n && j<= i+a[i] ;j++) {    //  
                if(j+a[j] >= r){ //遍历可到达位置 能到达的最远位置  
                    r = j+ a[j];    //更新左右边界  
                    l = j;  
                }  
            }  
            i = l;  //左边界  
              
        }  
        if(i< n-1) {  
            System.out.println("false");  
              
        }else{  
            System.out.println("true");  
        }  
    }  
}

XCP_Basic 移植步骤 阅读详情

相关推荐

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 298

leetcode:45. 跳跃游戏 II

题目来源 leetcode:jump-game-ii 题目描述 class Solution { public: int jump(vector<int>& nums) { } }; 题目解析 从数组的第 0 个位置开始跳,跳的距离小于等于数组上对应的数。求出跳到最后个位置需要的最短步数。 贪心 思路:别想那么多,就挨着跳吧 如果某一个起跳点的格式可以跳跃的距离是3,那么表示后面3个格子都可以作为起跳点 如果从这个起跳点叫做第1次跳跃,那么从后面3个格子起

OceanStar的博客 1913

无限维李代数局部与2-局部1/2-导子:从概念到Witt代数实例解析

在抽象代数与数学物理中,李代数是描述对称性的基本结构,而导子则是刻画其微分性质的核心算子。从经典的导子概念出发,通过引入“局部”与“分数阶”两个关键推广,形成了局部导子、2-局部导子以及1/2-导子等重要研究方向。这些推广不仅深化了对无限维李代数(如Witt代数、Virasoro代数)复杂结构的理解,其研究方法和结论也为共形场论、可积系统等物理理论提供了数学基础。本文聚焦于无限维李代数上局部与2-局部1/2-导子的系统研究,通过拆解核心概念、剖析典型代数结构,并以Witt代数为实例,详细演示了从全局1/2-

weixin_34072296的博客 391

跳跃游戏II(python)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。示例 1:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

叶柖的博客 882

【Cadence】 ADS Dynamic Link使用教程

在Cadence617上使用ADS Dynamic Link

乾巽的博客 6074

深入了解神经网络:构建人工智能的基石

这篇博客将为您解释神经网络的构造,让您能够理解这个令人着迷的领域的基本工作原理。神经网络是人工智能领域的关键技术,它们的构造基于神经元的灵感,并结合了数学、统计和机器学习的原理。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。:这是神经网络的核心部分,包含多个层次的神经元。、神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;

AI_dataloads的博客 2万+

45. 跳跃游戏 II 的 2 种解法比较

让最后一跳的边界达不到,从这一点也可以看出,解法二是从起跳点算step的。如果是从落点算step,最后一跳的边界达不到,则最终结果会少一步而出错。但是解法一是在刚刚越过边界更新的,但是最后一跳的边界从之前的分析可以看出是永远越不过去的,所以还需要对。由于解法二是在边界处更新,最后一跳的最远距离可能落在最后位置之外,也可能正好落在最后一个位置,所以。为什么解法二比解法二简洁?的情况进行判断,从而导致代码的冗余。

m0_60641871的博客 333

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7060

leetcode每日一题——45.跳跃游戏II(面试经典150题)

leetcode每日一题——45.跳跃游戏II(面试经典150题) 内容主要包括对这一题目的思路分析、步骤分析以及代码实现

m0_59800431的博客 1234

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 215

基于多智能体强化学习的轨道追逃博弈方法复现

本文提出了一种基于多智能体深度强化学习(MADDPG)的空间轨道追逃博弈方法。通过构建Actor-Critic网络架构,采用集中训练分布式执行的策略,使卫星群能够自主协调完成对非合作目标的围捕任务。代码实现了经验回放缓冲区、噪声探索机制和网络参数更新等核心功能,通过奖励函数设计平衡最短时间、燃料消耗和碰撞规避等目标。仿真结果表明该方法能有效利用数量优势,涌现出智能协同行为,为解决复杂空间博弈问题提供了新思路。

huanghm88的专栏 337

跳跃游戏①&② #python解法

题目:①:给你一个非负整数数组nums,你最初位于数组的。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。②:给定一个长度为n的整数数组nums。初始位置在下标 0。每个元素nums[i]表示从索引i向后跳转的最大长度。换句话说,如果你在索引i处,你可以跳转到任意(i + j)处。返回到达n - 1的最小跳跃次数。测试用例保证可以到达n - 1。

weixin_54113539的博客 791

11、ThingsBoard集群部署k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 990

【leetcode】Jump Game I, II 跳跃游戏一和二

题目: Jump Game I: Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that

he wolf 1403

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Leetcode 跳跃游戏一和二(动态规划和贪心)

55. 跳跃游戏 只判断是否能到达边界,这个只要每次维护一个变量,看看这个变量最大到哪即可。O(N) public boolean canJump(int[] nums) { int maxRight = 0; // 可到达右边最远的距离 for(int i=0;i<nums.length-1;i++){ if(i>maxRight) return false; maxRight =

wwxy1995的博客 283

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

X的平方根、跳跃游戏、 加一、跳跃游戏二、最大子阵列

设计函数int sqrt(int x),计算 xxx 的平方根。 输入格式 输入一个 整数 xxx,输出它的平方根。直到碰到文件结束符(EOF)为止。 输出格式 对于每组输入,输出一行一个整数,表示输入整数的平方根。 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 1 1 2 2 2 2 2 3 程序超时,...

qq_42799920的博客 377

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

231.跳跃游戏

【代码】231.跳跃游戏。

Runner__Binger的博客 362

代码随想录-250718-跳跃游戏Ⅱ

给定一个长度为 n的 索引整数数组 nums。初始位置为nums[0]。每个元素 ����[�]nums[i] 表示从索引 �i 向后跳转的最大长度。返回到达 ����[�−1]nums[n−1]的最小跳跃次数。生成的测试用例可以到达 ����[�−1]nums[n−1]。

qq_18402417的博客 212

055 Jump Game 跳跃游戏

给定一个非负整数数组,您最初位于数组的第一个索引处。数组中的每个元素表示您在该位置的最大跳跃长度。确定是否能够到达最后一个索引。示例:A = [2,3,1,1,4],返回 true。A = [3,2,1,0,4],返回 false。详见:https://leetcode.com/problems/jump-game/description/ Java实现: 方法一: class Solu...

weixin_30369041的博客 130

LeetCode055:跳跃游戏

实验平台:LeetCode 代码地址:my github 题目描述: 示例: 方法一 运行结果: 代码: class Solution { public boolean canJump(int[] nums) { int numLen = nums.length; boolean[] canJump = new bool...

FREEMAN 440

55.跳跃游戏

算法思路:看似简单,实则也简单,思路很重要。 方法一 :首先定义一个最大值maxRight用于存放每次循环的索引i位置能够到达的最远位置,每循环一次更新,如果在i时,maxRight的值比 i 小,则说明false,若当i的值为length-1时,maxRight的值仍大于等于i,则为true。 方法二:***贪心算法***局部最优达到全局最优。每个位置都计算自己能达到的最远距离,同时每个位置要...

laoli的博客 139

【动态规划】跳跃游戏(I、II)

1. 跳跃游戏I(中等) 1.1 题目 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是

taoxing 1715

跳跃游戏 I II

55.跳跃游戏 I 算法思路 我们的目标就是看每次的数字加上本省的位置是否能够到达最后的位置,可以通过贪心算法来进行求解。 首先我们分析一下整体的过程,我们就是从每一个位置跳,如果能跳到最后的位置,那就说明可以到。我们就直接计算每一个位置能够跳的最远的距离,记录下来,之后全局来看最远的距离是不是能够到最后的位置或者超过最后的位置即可。主要分两部分: 首先要看能不能跳到下一个位置 其次记录每个位置...

laoli的博客 264

动态规划-跳跃游戏

55. 跳跃游戏 给定一个非负整数数组nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 ...

The Shawshank Redemption 3175

跳跃游戏II

题目:给定一个长度为n的整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向后跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意i + j < n返回到达的最小跳跃次数。生成的测试用例可以到达。这道题时跳跃游戏的升级版,跟顶一个可以跳到最后一个位置的数组,找出最少的跳跃次数。这道题有两个解法:正向搜索与反向搜索。方法一:反向查找出发位置。

m0_74216199的博客 362
上一篇: java 位运算
下一篇: 分治算法,动态规划,贪婪算法以及递归之间的区别与联系
NFMSR
博客等级 码龄11年 59粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值