一、问题描述

  给定一个数组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;
}

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-27
  • 2022-02-19
  • 2022-01-07
  • 2022-12-23
猜你喜欢
  • 2021-05-11
  • 2021-06-26
  • 2022-02-20
  • 2021-11-02
  • 2021-12-16
  • 2021-09-03
  • 2022-01-29
相关资源
相似解决方案