题目二:不修改数组找出重复的数字
public class NO3in2 {
/**
* 避免使用辅助空间
*/
public int getDuplicate(int[] arr) {
if (arr == null || arr.length <= 0) {
System.out.println("数组输入无效!");
return -1;
}
for (int a : arr) {
if (a < 1 || a > arr.length - 1) {
System.out.println("数字大小超出范围!");
return -1;
}
}
int low = 1;
int high = arr.length - 1; // high即为题目的n
int mid, count;
while (low <= high) {
mid = ((high - low) >> 2) + low;
count = countRange(arr, low, mid);
if (low == high) {
if (count > 1)
return low;
else
break; // 必有重复,应该不会出现这种情况吧?
}
if (count > mid - low + 1) {
high = mid;
} else {
low = mid + 1;
}
}
return -1;
}
private int countRange(int[] arr, int start, int end)
{
int count = 0;
for(int i = 0;i < arr.length;i++)
{
if(arr[i] >= start && arr[i] <= end)
++count;
}
return count;
}
public static void main(String[] args) {
NO3in2 test=new NO3in2();
int[] arr = {2,3,5,4,3,2,6,7};
int value = test.getDuplicate(arr);
System.out.println(value);
}
}