【发布时间】:2014-12-28 06:21:02
【问题描述】:
几天前,在一次采访中,我被要求提供一个程序,该程序可以在O(log n) 时间找到连续整数数组中的单个重复元素。
这种情况有些具体,因为总共有 11 个整数(1 到 10,按此顺序)加上,其中任何一个数字的一个副本,插入在两者之间的某个位置。
给了我一个类似这样的样本:
{1, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10}
所以,现在我想出了以下 C 代码:
#include <stdio.h>
int main (void)
{
int a[11] = {1, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10}, first=0, last=10, mid;
while (1)
{
mid = (first + last)/2;
if (mid+1 == a[mid])
first = mid+1;
else if ((mid == 0) || (mid == 10) || (a[mid+1] - a[mid-1] == 1)) /* Order is Important, (a[mid+1] - a[mid-1] == 1) must be last */
break;
else
last = mid-1;
}
printf("Duplicate element is %d, located at position no. %d.", a[mid], mid+1);
return 0;
}
这是否能正确满足O(log n) 标准?而且,是否有任何替代/改进?
【问题讨论】:
-
提示:始终使用半开区间。顺便说一句:elseif-brnch 中的那些神奇数字呢?
标签: c arrays algorithm optimization duplicates