给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
思路:
我们可以得到一个重要的观察。从给定的位置,当我们试图看看我们是否可以跳到GOOD位置时,我们只使用一个 - 第一个(参见break语句)。换句话说,最左边的一个。如果我们将这个最左边的GOOD位置跟踪为一个单独的变量,我们可以避免在数组中搜索它。不仅如此,我们可以完全停止使用阵列。
从右到左迭代,我们检查每个位置是否有潜在的跳转到达GOOD索引(currPosition + nums[currPosition] >= leftmostGoodIndex
)。如果我们能够达到good的索引,那么我们的当前下标就是good。此外,这个新的GOOD位置将是新的最左边的GOOD下标。迭代一直持续到数组的开头。如果第一个位置是GOOD指数,那么我们可以从第一个位置到达最后一个指数。
为了说明这种情况,我们将使用下图来表示输入数组nums = [9, 4, 2, 1, 0, 2, 0]
。我们写G代表GOOD,B代表BAD,U代表UNKNOWN。假设我们一直迭代到位置0,我们需要确定索引0是否为GOOD。因为索引1被确定为GOOD,所以跳到那里就足够了,然后确保我们最终可以达到索引6.无论nums[0]
是大到足以一直跳到最后一个索引都没关系。我们所需要的只是一种方式。
参考代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int lastPosition= nums.size() - 1;
for (int currentPostion = nums.size() - 1; currentPostion >= 0; currentPostion--) {
if (nums[currentPostion] >= (lastPosition - currentPostion)) lastPosition=currentPostion;
}
return lastPosition==0;
}
};