Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4]
, return true
.
A = [3,2,1,0,4]
, return false
.
Have you met this question in a real interview?
题目的大意:数组A[]中存放着能向前的最大步数,判断能否从数组的0位置,到达数组的最后位置?
如现在的数组下标是pos,那么下一步的位置是[pos+1,pos+A[pos]] (A[pos]!=0) 如果这个值大于n-1 则能够到达最后一个元素。那么问题来了,如果A[pos]==0呢?返回false吗,现在下结论还为时过早,看两个例子
A=[3,2,1,0,4] return false
A=[3,3,1,0,4] return true
在A[pos]==0时,pos就向后退(pos值减少,退到它能够到达的位置),如果A[i]+i>pos+A[pos](值为0) 那么pos=A[i]+i;继续下面的判断。
class Solution {
public:
bool canJump(int A[], int n) {
if(n<2)
return true;
int pos=0;
while(pos<n-1)
{
if(A[pos]==0)
{
int i=-1;
for(i=pos-1;i>=0;i--)
{
if(i+A[i]>pos)
{
pos=i+A[i];
break;
}
}
if(i<0)
return false;
else
continue;
}
pos=pos+A[pos];
}
return true;
}
};
解法二:动态规划
dp[i]表示数组A[]的前i个元素能够到达的最远下标,如果dp[n-2]>=n-1 return true; 否则 return false;
class Solution {
public:
bool canJump(int A[], int n) {
if(n<2)
return true;
int pos=0;
int dp[n];
memset(dp,0,sizeof(int)*n);
dp[0]=A[0];
for(int i=1;i<n-1;i++)
{
if(i>dp[i-1])
return false;
else{
if(dp[i-1]>i+A[i])
dp[i]=dp[i-1];
else
dp[i]=i+A[i];
if(dp[i]>=n-1)
return true;
}
}
if(dp[n-2]>=n-1)
return true;
else
return false;
}
};