LeetCode 55 Jump Game

题目如下:

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.

看到题之后第一个想法就是判断每个位置 (i) 能否加上最大跳跃距离(A[i])到达n-1(数组长度减1),,,如果不行的话再遍历i+( 1~A[i] )这些位置,然后递归下去判断,,
下面是代码:

class Solution {
public:
    int c[100000]={0};
    bool canJump(vector<int>& nums) {
        return sss(nums, 0);
    }
    bool sss(vector<int>& nums, int cur){
        c[cur] = 1;
        if(cur + nums[cur] >= nums.size()-1) return true;
        if(cur == nums.size()-1) return true;
        if(nums[cur] == 0) return false;
        for(int i = nums[cur]; i>=1;i--){
            if(c[cur+i] == 1) continue;
            if(sss(nums, cur+i)) return true;
        }
        return false;
    }
};

用了个大数组保存已跑过的位置,,,不然最后一个test就TLE了,,,
不出意外效率极低,,,

这里写图片描述

然后发现其实不需要递归,只要从位置0开始判断所能达到的最远距离是否大于等于n-1。
遍历的时候要注意更新最大距离,并且要注意当前的位置i是否可以达到,即小于等于记录的最大距离。
附上代码~

bool canJump(vector<int>& nums) {
        if(nums.size() == 1) return true;
        int max=0;
       for(int i = 0; i < nums.size();i++){
           if(i > max) return false;
           if(i + nums[i] >= nums.size()-1) return true;
           max = i+nums[i] > max?i+nums[i]:max;
       }
       return false;
    }

效率果然好多了。。。

这里写图片描述

时间是少了很多,,但可以看出还是赶不上大部分人的水平,还得多多交流参考QwQ

猜你喜欢

转载自blog.csdn.net/bkjs626/article/details/78305187