贪心算法-数组跳跃游戏(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;

    }

}

四、刷题链接

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

相关推荐
ffcf5 小时前
消息中间件6:Redis副本数变为0和删除PVC的区别
算法·贪心算法
蕓晨8 小时前
钱币找零问题-贪心算法解析
c++·算法·贪心算法
我不会写代码njdjnssj8 小时前
贪心算法+动态规划
算法·贪心算法·动态规划
程序员-King.2 天前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
憨憨崽&3 天前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
李玮豪Jimmy3 天前
Day26:贪心算法part4(452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间)
算法·贪心算法
啊吧怪不啊吧4 天前
贪心算法(局部最优实现全局最优)第二篇
大数据·算法·leetcode·贪心算法
小龙报5 天前
【算法通关指南:数据结构和算法篇 】队列相关算法题:3.海港
数据结构·c++·算法·贪心算法·创业创新·学习方法·visual studio
xxxxxxllllllshi10 天前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
2501_9418024811 天前
C++高性能区块链节点与智能合约实战分享:分布式账本构建与交易优化经验
贪心算法