leetcode Problem: 55. 跳跃游戏
思路
假设我们是一个小人,从第一个下标开始,每次经过一个位置,我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值r=nums[i]+i。而这个r之前的区域一定都是可以经过的。那么我们就让小人经过这一段区域,同时不断更新r的值。r得到更新后继续走继续更新。直到走到终点或者说走到r对应的位置就停止(此时已无法继续前进)。如果停在了r的位置,那么说已经无法继续更新使得小人能继续走下去了,这时若没到达终点,就说明小人无法到达终点。
hint:其实这道题和 小人过桥 这个小游戏很类似(长按屏幕就能让桥不断变长):0就是悬崖,>0则是地面。不同的点在于这里的桥的长度是由地面上的数字来决定。
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
int i=0,n=nums.size(),r=0;
while(i<n&&i<=r)r=max(r,i+nums[i++]);
return i>=n;
}
};