题目描述
在一个长度为n+1的数组里的所有数字都在1-n之间,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},对应的输出是重复的数字2或3.
题解
- 利用额外的数组空间或者哈希表做判断。
- 利用二分的思想把数字从中间分为两部分,前面一半为1-m,后面为m+1-n。如果1-m的数字个数超过m,那么这一半的区间里一定包含重复数字,否则另一半区间一定包含重复数字。
代码实现(Java):时间复杂度:O(nlogn) .空间复杂度:O(1)
public static int getDuplication(int[] num){
if (num == null || num.length == 0){
return -1;
}
int start = 1,end = num.length - 1;
while (start <= end){
int middle = (start + end) >> 1;
int count = count(num,start,middle);
if (end == start){
if (count > 1){
return start;
}
else {
break;
}
}
if (count > (middle - start + 1)){
end = middle;
}else {
start = middle + 1;
}
}
return -1;
}
private static int count(int[] num, int start, int middle) {
if (num == null){
return 0;
}
int count = 0;
for (int i = 0;i < num.length;i++){
if (num[i] >= start && num[i] <= middle){
count++;
}
}
return count;
}