leetcode45-跳跃游戏II

原题

原题

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

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

说明:

假设你总是可以到达数组的最后一个位置。

解法

思想

  1. 动态规划,找到能到达最后一个位置的最靠左的点,然后把这个点设为新的要到达的位置,再找能到达这个点的最靠左的点,直到找到下标0为止。
  2. 贪心算法,每跳一次,在可跳范围内找能跳到的最远的地方,到达这个最远的地方时则步数加一。

代码

动态规划:

class Solution {
    public int jump(int[] nums) {
        int jumpTo = nums.length-1;
        int count = 0;
        while(jumpTo!=0){
            for(int i = 0;i<jumpTo;i++){
                if(i+nums[i]>=jumpTo) {
                    jumpTo = i;
                    count++;
                    break;
                }
            }
        }
        return count;
    }
}

贪心算法:(来源:windliang)

class Solution {
    public int jump(int[] nums) {
        int end = 0;
        int maxPosition = 0; 
        int steps = 0;
        for(int i = 0; i < nums.length - 1; i++){
            //找能跳的最远的
            maxPosition = Math.max(maxPosition, nums[i] + i); 
            if( i == end){ //遇到边界,就更新边界,并且步数加一
                end = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode45-%e8%b7%b3%e8%b7%83%e6%b8%b8%e6%88%8fii/

发表评论

电子邮件地址不会被公开。