【贪心算法】之跳跃游戏

问题:

复制代码
给定一个非负整数数组 [nums] ,开始时位于数组的初始位置 ,数组中每个下标对应的元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达数组的最后位置。

**思路:**贪心算法

看不懂的可以去下面这个链接看 具体思路

复制代码
贪心算法中的经典题目 跳跃游戏 (LeetCode 55)_哔哩哔哩_bilibili]
(https://www.bilibili.com/video/BV1Sk4y1C7cD?spm_id_from=333.337.search-card.all.click)

若是数组中的每一个元素值都大于0,无论怎么跳都可以到达最后的位置;

index是我们下一跳要跳到的最佳位置;

如下例所示,我们每次在 i 位置上可以跳跃到的最大位置max_jump= i+nums[i] ;当在 i=0上时候,我们可以最多跳四步,可以到 i=1,i=2,i=3,i=4;

那哪个位置最好呢,我们可以看到 i=1,2,3,4位置下对应的max_jump=5,4,6,5;显然i=3时候,max_jump最大,可以跳到6的位置,所以index=3;因为i=3,可以跳到最大位置6,其他 i对应的最大位置,i=3,都可以跳到;

java 复制代码
//数组跳跃
public class One {
    public static void main(String[] args) {
        int[] arr = {2, 3, 4, 0, 0, 0, 0, 2};
        ArrayList<Integer> list = new ArrayList<>();
        System.out.println(can(arr, list));
    }
    public static boolean can(int[] arr, ArrayList<Integer> list) {
        //先把计算出来的jump 即:每次最多可以跳得的最大位置存起来
        for (int i = 0; i < arr.length; i++) {
            list.add(i + arr[i]);//jump=i+arr[i]
        }
        int index = 1;//初始化索引 可以从1开始
        int max_jump = list.get(0);
        while (index < arr.length && index <= max_jump) {//当index达到数组尾部 或者超过max时,循环结束
            //index>max的话,说明此时索引已经超出你能跳跃的范围 循环也就终止了
            if (list.get(index) > max_jump) {
                max_jump=list.get(index);
            }
            index++;//继续后移
        }
        //循环结束时候判断index与数组长度大小关系 若相等则说明该问题有解 可以跳跃到最后
        if (index==arr.length){
            return true;
        }
        return false;
    }
}
java 复制代码
//2.优化以后的代码

//重新整理了一下思路,只要max_jump>=数组的最大下标我们就可以跳过去
package 算法.贪心算法;

public class ArrJumpBetter {
    public static void main(String[] args) {
        int[] arr={2,3,5,0,0,0,0,2,0,0};
        System.out.println(isCan(arr));

    }
    public static boolean isCan(int[] arr){
        if (arr.length==1){
            return true;
        }
        int max_jump=0;
        //只要max_jump可以覆盖到数组的长度大小就说明可以跳过去
        for (int i = 0; i <=max_jump ; i++) {
            max_jump=Math.max(max_jump,i+arr[i]);
            if (max_jump>=arr.length-1){
                return true;
            }
        }
        return false;
    }
}
相关推荐
胖咕噜的稞达鸭7 分钟前
AVL树手撕,超详细图文详解
c语言·开发语言·数据结构·c++·算法·visual studio
寒月霜华12 分钟前
JaveWeb后端-Web基础-SpringBoot Web、HTTP协议
前端·spring boot·http
张较瘦_19 分钟前
环境搭建 | [入门级]VSCode(Cursor|Trae|Qoder)搭建Java(Springboot3)企业开发环境全流程
java·ide·vscode
007php00723 分钟前
百度面试题解析:synchronized、volatile、JMM内存模型、JVM运行时区域及堆和方法区(三)
java·开发语言·jvm·缓存·面试·golang·php
YSRM27 分钟前
Leetcode+Java+图论II
java·leetcode·图论
十铭忘29 分钟前
基于SAM2的眼动数据跟踪2
java·服务器·前端
熊猫钓鱼>_>30 分钟前
Rust语言特性深度解析:所有权、生命周期与模式匹配之我见
算法·rust·软件开发·函数·模式匹配·异步编程·质量工具
okjohn40 分钟前
浅谈需求分析与管理
java·架构·系统架构·软件工程·产品经理·需求分析·规格说明书
芒果量化41 分钟前
Optuna - 自动调参利器&python实例
开发语言·python·算法·机器学习
麦麦大数据44 分钟前
D025 摩托车推荐价格预测可视化系统|推荐算法|机器学习|预测算法|用户画像与数据分析
mysql·算法·机器学习·django·vue·推荐算法·价格预测