📜  门|门 IT 2008 |问题 3(1)

📅  最后修改于: 2023-12-03 14:58:36.666000             🧑  作者: Mango

门|门 IT 2008 |问题 3

题目

有一个数组,其中每个元素都表示该位置能跳跃的最大长度。请确定您是否能够到达最后一个索引。

例如,给定以下数组:

[2,3,1,1,4]

我们依次到达:

  • 索引0,其中我们可以跳转2步。
  • 索引2,其中我们可以跳转1步。
  • 索引3,其中我们可以跳转1步。
  • 索引4,其中我们可以跳转4步。

显然,我们可以到达最后一个索引。

思路

本题可以使用贪心算法来解决。

维护一个变量 maxReach,表示当前可以到达的最远位置,初始值为0。

遍历数组,对于当前的元素 i,它能够到达的最远位置是 i + nums[i]。

如果当前位置i能够到达的最远位置大于 maxReach,则更新 maxReach

如果 maxReach 大于等于数组的最后一个索引,则可以到达最后一个位置,返回true;否则返回false。

代码
bool canJump(vector<int>& nums) {
    int n = nums.size();
    int maxReach = 0;
    for (int i = 0; i < n; i++) {
        // 当前能到达的最远位置
        int reach = i + nums[i];
        // 更新 maxReach
        if (reach > maxReach) {
            maxReach = reach;
        }
        // 如果 maxReach 大于等于数组的最后一个索引,返回 true
        if (maxReach >= n - 1) {
            return true;
        }
        // 如果到了不能跳的位置,返回 false
        if (i == maxReach) {
            return false;
        }
    }
    return false;
}

以上代码使用了C++语言。