55. 跳跃游戏

在这里插入图片描述
之前做过正则表达式一下就想出了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;
    }
};
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页