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

    }

}

四、刷题链接

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

相关推荐
yannan201903132 天前
【算法】(Python)贪心算法
算法·贪心算法
拿起键盘写八哥4 天前
贪心算法(Greedy Algorithm)
算法·贪心算法
却道天凉_好个秋4 天前
c++ 贪心算法
c++·贪心算法
二进制人工智能5 天前
【数据结构与算法】LeetCode: 贪心算法
算法·leetcode·贪心算法
南宫生5 天前
贪心算法习题其二【力扣】【算法学习day.19】
java·数据结构·算法·leetcode·贪心算法
正义的彬彬侠6 天前
什么是贪心算法
算法·机器学习·贪心算法
UestcXiye7 天前
LeetCode Hot 100:贪心算法
c++·leetcode·贪心算法·数据结构与算法
今天秃头了吗??8 天前
贪心算法入门(一)
java·数据结构·算法·贪心算法
南宫生8 天前
贪心算法理论基础和习题【算法学习day.17】
java·学习·算法·leetcode·链表·贪心算法
binqian9 天前
【K8S】kubernetes-dashboard.yaml
算法·贪心算法