ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 55. 跳跃游戏

2019-06-04 21:51:56  阅读:219  来源: 互联网

标签:return nums 55 位置 到达 int 跳跃 LeetCode dp


给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

 

首先想到的是暴力解一发,无奈超时。。。

class Solution {
public:
    int f=0;
    void jmp(int n,vector<int>& nums){
        int len = nums.size()-1;
        if(n== len){
            f=1;
            return ;
        }
        
        int m = min( ( n + nums[n] ) ,  len );
        for(int i=n+1;i<=m;i++){
            jmp(i,nums);
        }
        return ;
    }
    bool canJump(vector<int>& nums) {
        jmp(0,nums);
        if(f==1){
           return true;
        }
        return false;
    }
};

 

dp解一发。

 分析:

dp[i]表示到达i位置时剩余的步数(即还能往前走几步),当某个位置出现小于0的时候时就不可能到达最后一个位置。

而dp[i]又取决于dp[i-1]和nums[i-1]的最大值,再减一(往前走一步),故就得到了状态转移方程。见代码。

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

 

执行用时 : 8 ms, 在Jump Game的C++提交中击败了99.71% 的用户

内存消耗 : 10 MB, 在Jump Game的C++提交中击败了68.05% 的用户

 

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 

 

标签:return,nums,55,位置,到达,int,跳跃,LeetCode,dp
来源: https://blog.csdn.net/wyh1618/article/details/90812413

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有