79、贪心-跳跃游戏II

思路: 

首先理解题意:从首位置跳最少多少次到达末尾。

第一种:使用递归,将所有跳转路径都获取到进行求出最小值。

第二种:使用动态规划,下一次最优取决上一次的最优解

第三针:贪心,局部最优导致全局最优。也就是在0-i上最远可以跳多远j,那么在0-j上可达,在0-j上最远可以跳多远。以此类推,最终得出最少次数。每次都求的最少次数,导致全部加起来也是最少次数。

代码如下:

class Solution {
   public static int jump01(int[] nums) {
        if (nums==null||nums.length==0){
            return 0;
        }
        return process(nums,0,nums.length);
    }

    private static int process(int[] nums, int index, int N) {
        if (index>=N-1){
            return 0;
        }
        int num = nums[index];
        int minSteps = Integer.MAX_VALUE;
        //如果num==0 那么无法进for循环直接返回 Integer.MAX_VALUE
        for (int i = 1; i <=num; i++) {
            int steps = process(nums, index + i, N);
            // 只有当steps不为Integer.MAX_VALUE时,才考虑将其加入最小步数的计算
            if (steps != Integer.MAX_VALUE) {
                minSteps = Math.min(minSteps, 1 + steps);
            }
        }
        return minSteps;
    }

     public static int jump02(int[] nums) {
        if (nums==null||nums.length==0){
            return 0;
        }
        int N=nums.length;
        int[] dp = new int[N];
        //0...i 上最小需要跳几步
        dp[0]=0;
        for (int i = 0; i < N-1; i++) {
            int num = nums[i];
            int index = i + num;
            if (index>=N){
                index=N-1;
            }
            for (int j =i+1; j <=index; j++) {
                if (dp[j]!=0){
                    dp[j]=Math.min(dp[j],dp[i]+1);
                }else {
                    dp[j]=dp[i]+1;
                }
            }
        }
        return dp[N-1];
    }

    public static int jump(int[] nums) {
    int jumps = 0, farthest = 0, end = 0;
    // 注意这里是遍历到 nums.length - 1,因为我们到达最后一个元素时不需要再跳跃
    for (int i = 0; i < nums.length - 1; i++) {
        // 更新能够到达的最远位置
        farthest = Math.max(farthest, i + nums[i]);
        // 当到达上一跳能到达的边界时
        if (i == end) {
            jumps++;  // 增加跳跃次数
            end = farthest;  // 更新下一跳能到达的边界
            if (end >= nums.length - 1) {  // 如果已经能够到达或超过最后一个位置,则结束循环
                break;
            }
        }
    }
    return jumps;
}

}

相关推荐

  1. LeetCode-45. 跳跃游戏 II贪心 数组 动态规划】

    2024-05-03 15:04:11       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-03 15:04:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-03 15:04:11       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-03 15:04:11       82 阅读
  4. Python语言-面向对象

    2024-05-03 15:04:11       91 阅读

热门阅读

  1. 本地微服务springboot集成ftp服务器

    2024-05-03 15:04:11       28 阅读
  2. unity生成随机表元素间隔距离相同的点

    2024-05-03 15:04:11       40 阅读
  3. Centos 7.6(1810) 打包Openssh8.1p1

    2024-05-03 15:04:11       30 阅读
  4. spring循环依赖解决方案

    2024-05-03 15:04:11       32 阅读
  5. Python系列一之excel的读取

    2024-05-03 15:04:11       35 阅读
  6. SQL温习笔记【SQL Server】

    2024-05-03 15:04:11       35 阅读
  7. 《中华人民共和国妇女权益保障法》解读

    2024-05-03 15:04:11       32 阅读