【发布时间】:2015-06-16 08:40:11
【问题描述】:
我正在尝试编写一种递归算法,如果至少有一个array[i] == i,则该算法返回真。如果没有array[i] = i,则为 false。
另外,需要的参数是(int * arr, int start, int end)。所以我将用指针遍历数组。例如:
int A[] = {-50,-10,0,1,3,5,8,10};
cout << sameIndex(A,0,7) << endl; //displays 1 (true) since A[5] == 5
我遇到很多麻烦的部分是使它成为 O(log n)。我看不出将数组分成 2 个每个函数调用会得到正确的解决方案。想出这个算法的结构让我头疼。有人可以指出我正确的方向吗?我不是在寻找答案,我只是不知道如何开始递归解决这个问题,更不用说 O(log n) 时间了。
忘了说是的,整数是不同的并且是排序的。
我想通了!长颈鹿船长和亨里克是正确的,但他们使用的方法略有不同。我选择了长颈鹿船长的方法,因为它使用二分搜索更容易和更直观。 Henrik 使用了一个小“技巧”,通过减去 array[i] - i 来检查它们是否等于 0。无论如何这里是解决方案:
bool sameIndex(int * A, int start, int end)
{
int mid = (start + end)/2;
if(start <= end)
{
if(*(A + mid) == mid)
return true;
else if(*(A + mid) > mid) //search left
return sameIndex(A, start, mid - 1);
else //search right
return sameIndex(A, mid + 1, end);
}
return false;
}
我让它变得比实际更难。
【问题讨论】:
-
这怎么可能在
log(n)中运行?您必须检查每个条目才能知道没有array[i] == i。 -
如果您的数组始终是排序的,您还可以丢弃低于第一个索引 0 的值,以及高于最后一个索引 (size-1) 的值。
-
是的,忘了提到它们是有序的和不同的。我刚刚编辑了帖子。
-
所以你基本上只是在问如何实现普通数组的二进制搜索。
-
@Lundin 事情是在二进制搜索中,您输入要搜索的内容。在这里你不知道你在找什么。您只是检查当前索引是否对应于数组中该索引处的元素。也许我遗漏了一些明显的东西?
标签: c++ arrays algorithm recursion