当前位置:   article > 正文

跳跃游戏 II-leetcode45-贪心-java题解_跳跃游戏ii 贪心性证明

跳跃游戏ii 贪心性证明

问题说明来源leetcode

一、问题描述

45. 跳跃游戏 II

难度中等1918

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
  • 1
  • 2
  • 3
  • 4

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2
  • 1
  • 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000

二、题解:

思考过程:

如果扫描一定范围,取其中的最大值来作为条约点可以不?

对于第一个点肯定是索引为0的,这个元素肯定是要计入的。

那么当拿到nums[0]了呢?

先对【0,nums[0]】范围的元素继续扫描,取最大的。

但是最大的好像不一定行,因为如果该最大值距离上一个踩点很近,

比如说

元素:5 4 3 2 1 2 3 3
索引:0 1 2 3 4 5 6 7
  • 1
  • 2

上面的结果对于第一次扫描到的4肯定不是结果

那么好像不是取最大的,而是???

对于范围【0,5】的元素,应该是考虑len - 1 - nums[i]的大小才对!

但是这样子真能找到最小跳跃步数吗?会不会还增加了一些步数?

1 . . . . . . 1 . . . . . ? . . 1 . . . . . . . 1
  • 1

好像模拟不出来有什么情况,好像真的没问题。

那就这样

class Solution {
       public int jump(int[] nums) {
        if (nums.length == 1) return 0;
        int count = 0;
        int index = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[index] < nums.length - index - 1){
                count++;
                // 寻找下一个power,power 是使得len - nums[j] - j - 1最小的;
                int tmp = i;
                for (int j = i;j <= nums[index] + index; j++) {
                    if ( nums.length - nums[j] - j <= nums.length - nums[tmp] - tmp) tmp = j;
                }
                i = nums[index] + index;
                index = tmp;
            }else {
                break;
            }

        }
        return count+1;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

ok了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/518738
推荐阅读
相关标签
  

闽ICP备14008679号