55. 跳跃游戏
程序员文章站
2024-03-15 09:13:35
...
链接:https://leetcode-cn.com/problems/jump-game/
题解:https://leetcode-cn.com/problems/jump-game/solution/
我们可以用贪心的方法解决这个问题。
设想一下,对于数组中的任意一个位置 y,我们如何判断它是否可以到达?根据题目的描述,只要存在一个位置 x,它本身可以到达,并且它跳跃的最大长度为 x+nums[x],这个值大于等于 y,即 x+nums[x]≥y,那么位置 y 也可以到达。
换句话说,对于每一个可以到达的位置 x,它使得 [x]x+1,x+2,⋯,x+nums[x] 这些连续的位置都可以到达。
这样以来,我们依次遍历数组中的每一个位置,并实时维护 最远可以到达的位置。对于当前遍历到的位置 x,如果它在 最远可以到达的位置 的范围内,那么我们就可以从起点通过若干次跳跃到达该位置,因此我们可以用 x+nums[x] 更新 最远可以到达的位置。
复杂度分析
时间复杂度:O(n),其中 n 为数组的大小。只需要访问 nums 数组一遍,共 n 个位置。
空间复杂度:O(1),不需要额外的空间开销。
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size() == 0) {
return true;
}
// 最远能到达的下表位置
int max_arrived = 0;
for(int i = 0; i < nums.size(); ++i) {
// 判断最远到达的下标,是否已经超过当前index
// 能到达当前index
if(max_arrived >= i) {
// 更新最远到达的下标位置
max_arrived = max(max_arrived, i+nums[i]);
} else {
// 如果最远的位置,到达不了当前的index,直接返回false
return false;
}
}
// 可以到达>=nums.size()-1的下标
return true;
//return max_arrived >= nums.size()-1? true:false;
}
};
上一篇: 网站瞬间变黑白颜色代码