有谁知道一种比线性快的算法,可以在顺序的数字列表中查找重复项?我现在正在用Java工作,但是任何语言或伪代码都可以。
例如,鉴于此int []输入:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 7 | 8 | 9
输出将是索引或值为“ 7”。
我知道O(n)线性时间有明显的遍历,但是我试图通过O(log n)时间二分查找来看看是否有可能。
O(n)
O(log n)
如果您假设数字必须从0开始并增加1,则可以将中间值与索引进行比较。如果中间相同,则走高,如果中间不同,则走低。
这将为您提供二进制搜索时间O(log2 N)。唯一的区别是您正在与索引进行比较,而不是固定值。
public static void main(String... args) { int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9}; int duplicate = findDuplicate(array); System.out.println(duplicate); } 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; }