Jump Game 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 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代表GOODB代表BADU代表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;        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值