贪心算法-数组跳跃游戏(mid)

目录

一、问题描述

二、解题思路

1.回溯法

2.贪心算法

三、代码实现

1.回溯法实现

2.贪心算法实现

四、刷题链接


一、问题描述

二、解题思路

1.回溯法

使用递归的方式,找到所有可能的走步方式,并记录递归深度(也就是走步次数),当走完数组时更新最小步长并返回。

这种方式的缺点就是耗时很长,还容易产生栈溢出的问题

2.贪心算法

直接通过画图来说明一下过程,找局部最优解扩展到全局最优解:

这里**注意:**当 i >=maxReach时,说明不能到达数组末尾,返回-1

这里可以用下面的示例按照上面的执行过程模拟一下,理解一下到达不了数组末尾是一个什么过程。

三、代码实现

1.回溯法实现

java 复制代码
import java.util.*;

public class Solution {
    int minstep=-1;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minJumpStep (int[] nums) {
        // 首先对常见的几种场景进行判断
        if(nums.length==0||(nums.length>1&&nums[0]==0)){
            return -1;
        }else if(nums.length==1){
            return 0;
        }

        //使用回溯法
        findMinStep(nums,0,0);
        return minstep;
    }
    //回溯法对所有可能的情况进行判断
    public void findMinStep(int[] nums,int nowIndex,int steps){
        if(nowIndex>=nums.length-1){
            if(minstep==-1){
                minstep=steps;
            }else{
                minstep=Math.min(minstep,steps);
            }
            return;
        }
        if(nums[nowIndex]==0){
            return;
        }else{
            for(int i=1;i<=nums[nowIndex];i++){
                findMinStep(nums,nowIndex+i,steps+1);
            } 
        }
        
    }
}

2.贪心算法实现

java 复制代码
import java.util.*;

public class Solution {
    int minstep=-1;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minJumpStep (int[] nums) {
        // 首先对常见的几种场景进行判断
        if(nums.length==0||(nums.length>1&&nums[0]==0)){
            return -1;
        }else if(nums.length==1){
            return 0;
        }

        //使用贪心算法
        //定义变量:
        //nowstep 记录当前走了多少步
        //current 记录nowstep可以走到的最远距离
        //maxReach 记录走到current后到下一次更新step之前可以到达的最远距离
        //初始时,步数为1,走一步以后所在位置nums[0],最远可到达nums[0]
        int nowstep=1,current=nums[0],maxReach=nums[0];
        for(int i=1;i<nums.length;i++){
            maxReach=Math.max(maxReach,i+nums[i]);
            if(i>=maxReach){
                return -1;
            }
            if(current>=nums.length-1){
                break;
            }
            if(i==current){
                nowstep++;
                current=maxReach;
            }
        }
        return nowstep;

    }

}

四、刷题链接

跳跃游戏(三)_牛客题霸_牛客网

相关推荐
雨中rain2 小时前
贪心算法(2)
算法·贪心算法
ZZZ_O^O2 天前
【贪心算法入门第一题——860.柠檬水找零】
学习·算法·leetcode·贪心算法
雨中rain3 天前
贪心算法(1)
算法·贪心算法
今天秃头了吗??4 天前
贪心算法入门(三)
java·数据结构·算法·贪心算法
LuckyRich15 天前
【贪心算法】贪心算法四
算法·贪心算法
超级无敌暴龙战士(solider)5 天前
非对称之美(贪心)
java·开发语言·贪心算法
汉克老师6 天前
GESP4级考试语法知识(贪心算法(六))
开发语言·数据结构·c++·算法·贪心算法·图论
LuckyRich17 天前
【贪心算法】贪心算法三
redis·算法·贪心算法
橘子遇见BUG7 天前
算法日记 26-27day 贪心算法
算法·贪心算法
wshi107 天前
✅DAY30 贪心算法 | 452. 用最少数量的箭引爆气球 | 435. 无重叠区间 | 763.划分字母区间
python·算法·leetcode·贪心算法