之前做过正则表达式一下就想出了dfs递归,只要有一种情况可以满足就返回true,但是超时了,dfs的递归边界就是到达最后一位就是true,如果跳到的当前位为0直接false。因为从第0格开始跳,所以从1遍历到当前位能跳的最大值,只要有一个dfs当前位的下标+能跳到的值结果为true就返回true。
题解的是贪心,维护一个能够到达最远值,遍历数组,如果能够到达的最远值可以到达i号位,就判断能够到达的最远值和当前位i+nums[i]哪个大,如果更新后的能够到达最远值大于等于数组最后一位,直接true。如果遍历完了都不行,直接false。
class Solution {
public:
/*bool dfs(int index, vector<int>& nums){
if(index == nums.size()-1) return true;
if(index >= nums.size() || nums[index] == 0) return false;
for(int i = 1; i <= nums[index]; ++i){
if(dfs(index+i,nums)) return true;
}
return false;
}*/
bool canJump(vector<int>& nums) {
//dfs,在当前位置只要有一种跳跃情况满足即可
if(nums.size() == 0) return false;
//return dfs(0,nums);
int canArrive = 0;
for(int i = 0; i < nums.size(); ++i){
if(i <= canArrive){
canArrive = max(canArrive, i + nums[i]);
if(canArrive >= nums.size()-1) return true;
}
}
return false;
}
};
只要能达到的最大值大于等于nums.size()就行了
遍历nums,先判断当前位置能不能跳到,如果可以跳到,就判断最大跳跃距离和当前下标+当前能跳多少哪个大,看看要不要更新最大跳跃距离。
每次判断最大距离和数组长度-1哪个大,大于就返回true
class Solution {
public:
bool canJump(vector<int>& nums) {
//只要能达到的最大值大于等于nums.size()就行了
//遍历nums,先判断当前位置能不能跳到,如果可以跳到,就判断最大跳跃距离和当前下标+当前能跳多少哪个大,看看要不要更新最大跳跃距离
int maxn = 0;
for(int i = 0; i < nums.size(); ++i){
//如果最大距离连i都跳不到,也不用再继续判断了
if(maxn < i) return false;
if(maxn >= nums.size()-1) return true;
maxn = max(maxn,i+nums[i]);
}
return false;
}
};