【发布时间】:2014-06-11 15:42:14
【问题描述】:
问题:到达终点的最少跳跃次数
给定一个整数数组,其中每个元素表示可以从该元素向前执行的最大步数。编写一个函数来返回到达数组末尾(从第一个元素开始)的最小跳转次数。如果一个元素是 0,那么我们就不能穿过那个元素。
例子:
输入:arr[] = {1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9} 输出:3 (1-> 3 -> 8 ->9) 第一个元素是1,所以只能到3。第二个元素是3,所以最多可以做3个步骤,即到5或8或9。
来源:http://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/
我已经制定了一个线性时间算法,用于查找到达数组末尾所需的最小跳跃次数。
源码如下:
int minJumpsUpdated(int arr[], int n)
{
int *jumps = malloc(n * sizeof(int)); // jumps[n-1] will hold the result
int i =1, j = 0;
jumps[0] = 0;
for (i = 1; i < n; ) {
// if i is out of range of arr[j], then increment j
if (arr[j] + j < i && j < i) {
j++;
// else if i is within range of arr[j],
// jumps for ith element would be jumps[j]+1
} else if (arr[j] + j >= i && j < i) {
jumps[i] = jumps[j] + 1;
i++;
} else {
printf("solution does not exist");
return -1;
}
}
printf("jumps: ");
for (i = 0; i < n; i++) {
printf("%d, ", jumps[i]);
}
return jumps[n - 1];
}
例子:
1.) 最初是i=1, j=0 和arr[] = {1, 3, 6, 1, 0, 9};
jumps[] = 0,0,0,0,0,0
2.) 因为i 在arr[j] 的范围内,即。 i<= j+arr[j],到第 i 个位置所需的跳跃次数是到第 j 个位置的最少跳跃次数 + 1。
i=2, j=0, jumps[] = 0,1,0,0,0,0
3.) i>j+arr[j] 即j++;
i=2, j=1, jumps[] = 0,1,0,0,0,0
4.) i<=j+arr[j] 即jumps[i] = jumps[j]+1;
i=3, j=1, jumps[] = 0,1,2,0,0,0
5.) i<=j+arr[j] 即jumps[i] = jumps[j]+1;
i=4, j=1, jumps[] = 0,1,2,2,0,0
6.) i<=j+arr[j] 即jumps[i] = jumps[j]+1;
i=5, j=1, jumps[] = 0,1,2,2,2,0
7.) i>j+arr[j] 即j++;
i=5, j=2, jumps[] = 0,1,2,2,2,0
8.) i<=j+arr[j] 即jumps[i] = jumps[j]+1;
i=6, j=2, jumps[] = 0,1,2,2,2,3
----- 结束 ------
我无法弄清楚该程序在哪个测试用例下不起作用。我问这个是因为在互联网上优化的解决方案使用的是 O(n^2) 的 DP。我的解决方案是线性时间。即 O(n)。因此,我假设该算法无法处理某些情况。所以我很好奇它不处理哪些情况。
您的帮助将不胜感激。
谢谢。
【问题讨论】:
-
@Jarod42 我试着改进了一下。
-
嗯,我们只有你的程序,没有描述它应该做什么。如果该程序只是您的问题描述,那么是的,它总是可以正常工作。而且由于它总是线性的,如果有人证明了原始问题的下限
n²,它显然无法正确描述问题。所以请给我们一个你应该解决的问题的明确定义。另外:您可以删除 C++ 标记,这是 C。然后,不要将malloc的返回值转换为free您的数组末尾。 -
@JensGustedt:我添加了问题陈述。此外,我将确保释放分配的内存。非常感谢您指出这一点。
-
@JensGustedt o(f) 表示上限,而不是下限。另外,为什么不只是提醒外星人,在问题中包含问题陈述本身(而不仅仅是指向它的链接)是很常见的?
-
只要生成随机测试用例,比较两种算法的结果,如果存在反例,就可以找到。如果你没有找到,那不能证明你的算法是正确的,但如果你找到了,那就证明情况并非如此,只有这样,在我看来,把它带到 Stack Overflow 上才是明智的。顺便说一句,DP 方法可以通过范围最小查询在 O(n log n) 内实现。
标签: c algorithm data-structures dynamic-programming