刷题55. Jump Game

一、题目说明

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

二、我的解答

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

我的代码:

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

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

class Solution{
public:
    bool canJump(vector<int>& 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<int>& 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.
posted @ 2020-02-16 10:48  siwei718  阅读(101)  评论(0编辑  收藏  举报