55. Jump Game

leetcode

Posted by chl on May 19, 2019

题目

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

题意

给定一个非负整型数组,索引从第一个元素开始,每个元素的数值表示所能够跳跃的元素个数,判断从第一个元素开始,根据每个元素的数值能否跳跃到最后一个元素的位置

例子

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.

题解

我们从后面开始判断,首先对end前面的元素大小进行判断,如果能够达到最后一个(>=1),则分治(递归),此时就可以看成前面的元素能否达到end-1的位置。否则就继续往前走。重复直到能递归进去第一个元素,则说明成功只要能够到达第一个元素,就能够到达最后一个元素,所以返回true。否则失败。

代码

func canJump(nums []int) bool {
    return Jump(nums,len(nums)-1)
}

func Jump(nums []int,end int)bool{
    count := 1
    if end==0{
        return true
    }
    end--
    for end>=0{
        if nums[end]<count{
            count++
            end--
            continue
        }else{
            return Jump(nums,end)
        }
    }
    return false
}

总结

这道题起初也没什么想法,但是能感觉出这道题或许跟dp有点关系,试着从后面往前面分析,发现能到达最后一个元素的条件是建立在前面是否有元素能够到达最后一个,如果有则进一步判断能否到达“上一个”元素。从而通过递归就能解决了。