尝试用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;
}
};