刷题55. Jump Game

一、题目说明

题目55. Jump Game,给定一组非负数,从第1个元素起,nums[i]表示你当前可以跳跃的最大值,计算能否到达最后一个index。难度是Medium。

二、我的解答

非常惭愧,这个题目我做完,提交n次,除了几次边界错,其他就是Time Limit Exceeded,而且优化也无果。

我的代码:

class Solution{
public:
    bool canJump(vector& nums) {
        vector dp(nums.size(),false);
        dp[0] = true;
        for(int i=0;i

经过分析,上述代码是采用dp解答的,问题出在“从左到右”计算。如果“从右到左”,用不用dp都很容易解决:

class Solution{
public:
    bool canJump(vector& nums) {
        //数组长度为1可以到达,如果nums[0]为0不可到达 
        if(nums.size()<=1)
            return true;
        else if(nums[0] == 0)
            return false;
        for(int i=nums.size()-2;i>0;i--){
            //找到0,从前1个开始,判断能否跳过去 
            if(nums[i]==0){
                int j=i-1;
                while(j>=0){
                    if(nums[j]>(i-j)){
                        i = j;
                        break;
                    }else if(j==0) 
                        return false;
                    j--;
                }
            }
        }
        return true;
    }
};

性能:

Runtime: 16 ms, faster than 29.20% of C++ online submissions for Jump Game.
Memory Usage: 9.9 MB, less than 80.26% of C++ online submissions for Jump Game.

三、优化措施

看了大神的解答,十年苦读白费了。4行代码,可读性好,绝妙之极!

class Solution{
public:
    //dp算法,从最后一个开始,last指示最后要能跳到的位置
    bool canJump(vector& nums) {
        int last = nums.size() - 1;
        for(int i = nums.size() - 2; i >= 0; i--) 
            if(last - i <= nums[i]) last = i;
        return last == 0;
    }
};

性能还不错:

Runtime: 12 ms, faster than 74.46% of C++ online submissions for Jump Game.
Memory Usage: 9.9 MB, less than 86.84% of C++ online submissions for Jump Game.

你可能感兴趣的:(刷题55. Jump Game)