- 动态规划思想
-
观察。
我们设置dp数组,下标表示位置,值表示当前可跳最大步数。
-
确定状态方程。
我们进行一步一步跳的 *** 作,假设我们要跳到第n个位置,那么dp[n-1]必须大于1,跳到位置n后,我们确定dp[n]的值。更新值来源于
- dp[i-1]-1 前一步可跳步数减1
- nums[i] 给出的可跳最大步数值
我们只需找到这两个谁大就可以确定状态方程了。
dp[i]=max{dp[i-1]-1,nums[i]}
-
确定边界条件
由状态方程知i-1>=0,位置0时我们设置它最大步数为它本身,即dp[0]=nums[0]。
-
最终结果
当dp[i]出现值为零的时候,但i却不等于numsSize-1,则不能到达,否则可以。
注意:
- 当第0个位置为零的时候,无法使用状态方程,起始为零表面一开始就不能跳了。
- 当numsSize=1时,起始点即为终点。
bool canJump(int* nums, int numsSize){
if(numsSize==1)
return true;
if(nums[0]==0)
return false;
int dp[numsSize];
dp[0]=nums[0];
for(int i=1;i<numsSize;i++)
{
dp[i]=fmax(--dp[i-1],nums[i]);
if(dp[i]==0&&i!=numsSize-1)
return false;
}
return true;
}
了解后,为了减少空间复杂度,将数组改为变量
bool canJump(int* nums, int numsSize){
if(numsSize==1)
return true;
if(nums[0]==0)
return false;
int a,b;
a=nums[0];
for(int i=1;i<numsSize;i++)
{
b=fmax(--a,nums[i]);
if(b==0&&i!=numsSize-1)
return false;
a=b;
}
return true;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)