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要找的。你的意思是它不可能存在?