package dataconfig;
/*不修改数组找重复值*/
/***
* 长度为n的数组,所有数字都在1~n-1,至少有一个数字重复
* 把1~n-1分为两部分,前一半1~m,后一半m~n-1
* 1~m数字超过m,则一定包含重复数字,反之另一半则包含
* 但不能保证找出所有重复数字
* */
public class FindDuplicateArr {
public int getDuplication(int numbers[]){
if (numbers == null && numbers.length <0){//判断数组是否为空
return -1;
}
int start = 1;
int end = numbers.length-1;
while(end >= start){
int middle = ((end - start) >> 1)+start;//选取m数字,为4
int count = countRange(numbers,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 int countRange(int[] numbers, int start, int middle) {//统计当前数子子段在数组出现的次数
if (numbers == null){
return 0;
}
int count = 0;
for (int i = 0;i<numbers.length;i++){
if (numbers[i]>=start && numbers[i] <= middle){
++count;
}
}
return count;
}
public static void main(String[] args) {
FindDuplicateArr farr = new FindDuplicateArr();
/*长度为8的数组,所有数字都在1~7之间,至少有一个重复*/
int a[] = new int[]{2,3,5,4,3,2,6,7};
int b = farr.getDuplication(a);
System.out.println(b);
}
}