我试图了解此link中给出的此问题的解决方案。 解决了O(logN)时间的问题。
// A Binary Search based function to find the element
// that appears only once
void search(int *arr, int low, int high)
{
// Base cases
if (low > high)
return;
if (low==high)
{
printf("The required element is %d ", arr[low]);
return;
}
// Find the middle point
int mid = (low + high) / 2;
// If mid is even and element next to mid is
// same as mid, then output element lies on
// right side, else on left side
if (mid%2 == 0)
{
if (arr[mid] == arr[mid+1])
search(arr, mid+2, high);
else
search(arr, low, mid);
}
else // If mid is odd
{
if (arr[mid] == arr[mid-1])
search(arr, mid+1, high);
else
search(arr, low, mid-1);
}
}
我能够理解这种方法。但我不明白为什么
当mid
是偶数且arr[mid] != arr[mid + 1]
时。我们为什么要用high = mid
而不是 high = mid - 1
。我找到了将其带到无限循环的测试用例。但是,即使我们使用mid
mid + 1
的充分理由
如果有人可以解释我们使用high = mid
的明确原因,这将非常有帮助
而不是high = mid - 1
。
这是将其带入无限循环的测试用例。
[1,1,2,3,3,4,4,8,8]
答案 0 :(得分:1)
当mid is even and arr[mid] != arr[mid + 1]
时,唯一值可以是中间值。因此,您必须再次从[low, mid]
运行搜索。例如,考虑此数组
[1,1,2,3,3]
在第一遍中,mid
是偶数,arr[mid] != arr[mid + 1]
。但是,如果仅在search
上运行[low, mid-1]
,将永远找不到唯一的数字,因为数字本身就是mid
。