Java 数组中具有重复元素的二进制搜索

Java 数组中具有重复元素的二进制搜索,java,algorithm,binary-search,Java,Algorithm,Binary Search,我想找出重复元素列表中是否有单个元素 对于此代码 private static int findDuplicate(int array[]) { int low = 0; int high = array.length - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = array[mid]; if (midVa

我想找出重复元素列表中是否有单个元素

对于此代码

private static int findDuplicate(int array[]) {
    int low = 0;
    int high = array.length - 1;

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = array[mid];
        if (midVal == mid)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return high;
}
输出将为“4”

或此int[]输入:

[1,1,2,2,3,3,4,5,5]
[1,1,2,2,3,4,4,5,5,6,6]
[1,1,2,7,7,9,9]
输出将为“3”

在此int[]输入中:

[1,1,2,2,3,3,4,5,5]
[1,1,2,2,3,4,4,5,5,6,6]
[1,1,2,7,7,9,9]
输出将为“2”

我现在用Java工作,但任何语言或psuedo代码都可以

我知道O(n)线性时间的明显遍历,但我试图通过O(logn)时间的二进制搜索来看看这是否可行

元素已排序,仅重复两次!
我知道简单循环的方法,但我想通过二进制搜索来实现。

考虑每对2个连续元素:(具有2个不同元素的对突出显示)(注意,末尾有一个游离元素)

(11)(22)(33)(45)(56)(67)(78)(8)
请注意,只有一个非重复的元素将生成相应的对,所有后面的对都具有不同的值,之前的对具有相同的值

因此,只需对不同对的索引进行二进制搜索

该算法也不需要对列表进行排序,只需要在连续索引中恰好有一个元素出现一次,而所有其他元素出现两次


特殊情况:如果最后一个元素是唯一的,则所有对都将具有相等的值。

就索引而言,每一对相同的值将如下所示:

(0,1),
(2,3),
(4,5)
(6,7)
你们可以清楚地看到,若索引是偶数,那个么就和下一个元素检查相似性。若索引为奇数,则可以使用以前的值检查相似性。 若对称性被破坏,你们可以向左移动,或者若一切正常,继续向右移动

伪代码(未测试):

low = 0,high = arr.length - 1

while low <= high:
    mid = (low + high) / 2
    if mid == 0 || mid == arr.length - 1 || arr[mid] != arr[mid-1] and arr[mid] != arr[mid + 1]: // if they are corner values or both left and right values are different, you are done
        return arr[mid]
    if(mid % 2 == 0):
        if arr[mid + 1] != arr[mid]: // check with next index since even for symmetry
            high = mid
        else:
            low = mid + 2
    else:
        if arr[mid - 1] != arr[mid]: // check with prev index since odd for symmetry
            high = mid
        else:
            low = mid + 1

return -1
low=0,high=arr.length-1

“低”是指“顺序列表”中的所有数字都必须存在吗?我知道使用简单循环查找4的方法。但我想通过二进制搜索:)回答你的问题了吗?@GiorgiTsiklauri这是这个问题的反面。。。但是是的,op在描述中不是很清楚。@user202729为什么这是相反的?上面说用二进制搜索在序列列表中找到一个副本,这就是OP要找的。你的意思是它不可能存在?