LeetCode-55. Jump Game

一、问题描述

  给定一个数组nums,给定一个非负整数数组, 您最初定位在数组的第一个索引处。数组中的每个元素表示该位置上的最大跳转长度。确定是否能够到达最后一个索引。

例子:

A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

二、问题解决

1、暴力解法,一步一步尝试,用递归来解决。

//该函数的意义是从nums的pos位置往后能不能到达最后一个位置
bool jump(vector<int>& nums, int pos) {
    if (pos >= nums.size() - 1) return true;
    for (int i = nums[pos]; i > 0; i--) {
        //当nums[pos]为0的时候不能往下跳,会陷入死循环,所以这里有这个判断
        if (nums[pos] == 0)
            continue;
        if (jump(nums, pos + i) == true)
            return true;
    }
    return false;
}
bool canJump(vector<int>& nums) {
    return jump(nums,0);
}

 2、贪心算法,寻找最大可到达的距离,然后看该距离是否大于数组长度

bool canJump(vector<int>& nums) {
    //dis表示在i之前位置所能到达的最远距离
    int dis = 0;
    //i<=dis这个条件保障了i这个位置是可以通过i之前的位置到达
    for (int i = 0; i < nums.size() && i <= dis; i++)
        dis = max(nums[i]+i,dis);
    if (dis < nums.size() - 1)
        return false;
    return true;
}
原文地址:https://www.cnblogs.com/likaiming/p/8511083.html