您的位置:首页 > 其它

LeetCode Jump Game II

2013-12-26 20:27 274 查看
第一次 递归

int jump_res(int *arr,int n,int cur)
{
if (cur>=n-1)
return 0;
int minv = Inf;
for (int i=1;i<=arr[cur];i++)
{
int tempv = 1+jump_res(arr,n,cur+i);
if (minv>tempv)
{
minv = tempv;
}
}
return minv;
}
int jump(int A[], int n) {
return jump_res(A,n,0);
}


第二次 DP

int jump(int A[],int n)
{
int *dp = new int
;
dp[0] = 0;
for (int i=1;i<n;i++)
{
if (i<A[0])
dp[i] = 1;
else
dp[i] = 100000;
}
if(dp[n-1]==1)
return 1;
for (int i=1;i<n-1;i++)//to the n-1, A[n-1] is not important
{
for (int k=1;k<=A[i];k++)
{
if (i+k<n&&dp[i]+1<dp[i+k])
{
dp[i+k] = dp[i] + 1;
}
}
}
return dp[n-1];
delete[] dp;
}
还是time limited

第三次 DP带优化的

int jump(int A[],int n)
{
int *dp = new int
;
dp[0] = 0;
for (int i=1;i<n;i++)
{
if (i<=A[0])
dp[i] = 1;
else
dp[i] = 100000;
}
if(dp[n-1]==1)
return 1;
for (int i=1;i<n;i++)//to the n-1, A[n-1] is not important
{
if (A[i]<A[i-1])// this optimization is important
continue;
for (int k=1;k<=A[i]&&i+k<n;k++)
{
if (i>=k&&A[i]+k<=A[i-k])//A[i-k] would be more close than A[i] to A[n-1]
continue;
if (dp[i]+1<dp[i+k])
{
dp[i+k] = dp[i] + 1;
}
}
}
return dp[n-1];
delete[] dp;
}
通过了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: