leetcode55-跳跃游戏

原题

原题

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

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

判断你是否能够到达最后一个位置。

示例1:

输入: [2,3,1,1,4] 输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例2:

输入: [3,2,1,0,4] 输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

解法

思想

  1. 动态规划,看某一个点是否能到达最后一个点,如果能,那是否另外某个点能到达这个点。
  2. 贪心算法,如果能到达点a,那么a之前的点也一定能够到达。从右往左找到一个能到达最后一个点的位置,然后继续往左找到一个能到达当前点的位置,如此循环,如果能找到第一个点则返回true。

代码

动态规划+记忆:

class Solution {
    int[] numsGlobal; 
    Boolean[] canJump;
    public boolean canJump(int[] nums) {
        numsGlobal = nums;
        canJump = new Boolean[nums.length];
        return canJumpTo(nums.length-1);
    }

    public boolean canJumpTo(int index){
        if(index == 0) return true;
        if(canJump[index]!=null) return canJump[index];
        for(int i = 0;i<index;i++){
            if(numsGlobal[i]>=index-i) {
                if(canJumpTo(i)) {
                    canJump[i] = true;
                    return true;
                }
            }
        }
        canJump[index] = false;
        return false;
    }
}

贪心算法:

倒序

public class Solution {
    public boolean canJump(int[] nums) {
        int lastPos = nums.length - 1;
        for (int i = nums.length - 1; i >= 0; i--) {
            if (i + nums[i] >= lastPos) {
                lastPos = i;
            }
        }
        return lastPos == 0;
    }
}

正序

func canJump(nums []int) bool {
    farest := 0
    for index, distance := range nums{
        if index > farest{
            return false
        }
        if index + distance > farest{
            farest = index + distance
            if farest >= len(nums) - 1{
                return true
            }
        }
    }
    return true
}

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

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月8日
下一篇 2020年2月9日

相关推荐

发表回复

登录后才能评论