在排序的数组中找到单个元素,其中每个元素都出现两次,除了一个|数据结构与算法

时间:2020-05-13 18:11:12

标签: algorithm data-structures binary-search

我试图了解此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]

1 个答案:

答案 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