package project;
/**
* 题目:0-n-1中缺失的数字。数组是递增数组,所有数字唯一一个。 0-n-1有且只有一个数字不在该数组。
*
* @author hexiaoli
* 思路:剑指offer 思路: 1)求0-n-1的和,再求实际数组中0-n-1的和,做差就好了。
*2)二分法。如果中间元素值和下标相等,那么下一轮只需要查找右半边,如果不等且前一个元素和下标相同,则找到。
* 如果不等且前一个元素和下标不同,查找左半边。
*
*/
public class Main {
public static int getMissingNumber(int[] array, int length) {
// 边界
if (array == null || array.length <= 0 || length <= 0) {
return -2;
}//判断首尾
if(array[0]!=0) {
return 0;
}
if(array[array.length-1]==length-2) {
return array.length;
}
// 左右两个指针
int left = 0;
int right = length - 1;
// 如果两个指针不相遇则一直循环
while (left <= right) {
//取中值
int mid = (left + right) >> 1;
//如果中间元素值和下标不等
if (mid<=right&&array[mid] != mid) {
//已经到了数组开始或者中间元素值左边和下标相等
if (mid == 0 || array[mid - 1] == mid - 1)
return mid;
right = mid - 1;//只在数组左侧出现
} else {//中间元素值和下标等
left = mid + 1;//只在数组右侧出现
}
}
//左边指针到末尾,说明没有发现缺少的情况
if(left == length) {
return -1;
}
return -1;
}
public static void main(String[] args) {
int[] array = { 0, 2 };
int[] array1 = { 1, 2 };
int[] array2 = { 0 };
int[] array3 = {};
int[] array4 = { 0, 1, 2 };
System.out.println(getMissingNumber(array,3));
System.out.println(getMissingNumber(array1,3));
System.out.println(getMissingNumber(array2,1));
System.out.println(getMissingNumber(array3,0));
System.out.println(getMissingNumber(array4,3));
System.out.println(getMissingNumber(array4,4));
}
}