首页 > 编程语言 >LeetCode-Java:55.跳跃游戏

LeetCode-Java:55.跳跃游戏

时间:2023-12-04 21:55:49浏览次数:44  
标签:index 下标 nums 55 int Java return true LeetCode

题目

给你一个非负整数数组 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 , 所以永远不可能到达最后一个下标。

①暴力递归法,将情况分解为当前元素是0则此路不通,非0的话看元素是几就递归几次,如果出现下标是最后一个元素的话就说明找到一条通路。此解超出时间限制。

class Solution {
    private boolean can=false;
    public boolean canJump(int[] nums) {
        dfs(nums,0);
        return can;
    }
    private void dfs(int[] nums,int index){
        //数组,当前下标
        if(index==nums.length-1){
            can=true;
            return;
        }
        else if(nums[index]==0){
            //如果当前的下标元素是0,就返回
            return;
        }
        for(int i=1;i<=nums[index];i++){
            if(index+i>=nums.length){
                break;
            }
            dfs(nums,index+i);
        }
    }
}

②用一个数组遍历所有元素,考虑了各种可能情况,用了很多if-else。简单说,是找到一个元素为0的,然后存储当前下标,往前一个个回溯,查找上一个元素的数据加上元素的下标能否跳过0,如果可以跳过0,则不再向前查找,从跳过的部分开始继续向下。超过99%,50min50s完成

class Solution {
    public boolean canJump(int[] nums) {
       int index_now = 0;
        boolean zero = false;
        for (int i = 0; i < nums.length; ) {
            if (zero == true) {
                //向前回溯想办法跳过index_now的那个0
                if (i == -1) {
                    //如果数组下标变成-1,则表示找不到办法,返回假
                    return false;
                }
                if (nums[i] + i > index_now) {
                    //如果可以跳过存储的0位置
                    if(nums[i]+i>=nums.length){
                        //如果跳过后数组已经遍历完成,则返回真
                        return true;
                    }
                    zero = false;
                    i += nums[i];
                } else {
                    i--;
                }
            }
            else if (nums[i] == 0) {
                //如果当前元素是0,则向上寻找跳过该零的方法
                index_now = i;//记录当前0的位置,找办法跳过
                zero = true;//设置回溯条件,为true时要i--找到可以跳过这个0元素的情况
                if(i==nums.length-1)return true;
                i--;
            } else {
                if (i + nums[i] > nums.length - 1) {
                    //如果往下走会超过数组大小,返回真
                    return true;
                }
                i = i + nums[i];
            }
        }
        return false;
    } 
}

③leetcode解题思路,详细见注释

class Solution {
    public boolean canJump(int[] nums) {
        //如果一个位置可以到达,那么左侧的所有位置都应该可以到达
        int max=0;
        for(int i=0;i<nums.length;i++){
            //如果当前元素已经超过了能到达的最远距离,就说明不能到达数组最后
            if(i>max) return false;
            max=Math.max(max,nums[i]+i);//记录当前能到达的最远距离
        }
        return true;
    } 
}

标签:index,下标,nums,55,int,Java,return,true,LeetCode
From: https://www.cnblogs.com/-zyr/p/17876102.html

相关文章

  • 黑马java基础简记
    day02——数据类型、运算符需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的-比如23,它默认就为int类型;如果加上后缀L,则为long类型;-比如23.8,它默认为double类型;如果加上后缀F,则为float类型; //如果希望随便写一个整型字面量是long类型的,需要在其后......
  • CF55D Beautiful numbers
    题意给定序列\(S\)。求满足以下性质的\(S\)的排列的数量:\(\max_{j=1}^{i-1}s_j\ge2\timess_i\)或\(\max_{j=1}^{i-1}2\timess_j\les_i\)。Sol排个序先。设\(f_i\)表示我们从小到大往\(s\)里面填数,现在填的最大值为\(s_i\)的方案数。不难......
  • Java学习之路(十二)
    Java学习之路(十二)1、时间日期类1.1、Date类(应用)计算机中时间原点1970年1月1日00:00:00时间换算单位1秒=1000毫秒Date类概述Date代表了一个特定的时间,精确到毫秒Date类构造方法方法名说明publicDate()分配一个Date对象,并初始化,以便它代表它被分......
  • Java变量
     1.Java命名规则包名:全部小写,多单词.隔开aaa.bbb.ccccom.baidu.类名和接口:每个单词首字母大写大驼峰AaaBbbCcc变量名函数名小驼峰:换单词大写aaaBbbCccnextInt(){}左括号前不换行变量声明格式:数据类型变量名=初始值;=1.表示赋值,将右边的内容存入到左边......
  • 一个关于swing实时翻译的java文件
    首先是我的架构,分别是启动,百度api接口的调用文件,swing的界面设计文件 其中的依赖是酱紫的(自己敲)<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version>......
  • CSV文件转Html用Java怎么实现?
    要将CSV文件转换为HTML格式,可以使用Java编程语言。以下是一个简单的Java代码示例,可用于将CSV文件转换为HTML表格:importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;publicclassCsvToHtmlConverter{publ......
  • Java基本数据类型、包装类及拆装箱详解
    Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实现进行分析。基本数据类型与......
  • 0x05.HelloJAVA
    基础知识java的类目和文件名必须相同(区分大小写)java文件,先编译成字节码(.class文件),然后在JAVA的虚拟机JVM上以解释方式执行字节码java的项目里面包含了源代码、依赖、配置文件,会直接打包,生成编译后的项目java的包,com.aaa.bbb相当于三个文件夹"."可以理解成/属于某......
  • 基于Java的书店仓库管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......
  • 基于Java的实验室设备管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......