55. Jump Game

来源:互联网 发布:2011年nba总决赛数据 编辑:程序博客网 时间:2024/06/17 14:59

尝试用dp思想解决这个问题,答案是正确的,但是超时了。尝试改进dp。

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

改进后的代码,新增加一个sum数组存储结果,因为dp在更新的时候,需要选出[i+1,i+n[i]]之间的最大值。现在减少计算步骤,不再搜素最大值,而是判断i能不能到达尾部,可以就是1,不可以就是0。并且统计sum数组,计算之前dp的和。dp[i]在更新时候,通过计算sum[i+1]-sum[i+1+n[i]]得到,如果该数字大于1,那么这之间一定存在一个数,它可以到达末尾,否则就不存在。

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