public class A011_数组中的最小可用id {
public static void main(String[] args) {
int[] arr = { 3, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16 };
check(arr, 0, arr.length - 1);
}
public static void check(int[] arr, int left, int right) {
int mid = (right + left) / 2;
int a = arr[mid];
int b = mid + arr[0];
if (a == b) {
find(arr, mid + 1, right);
} else {
find(arr, left, mid);
}
}
public static void find(int[] arr, int left, int right) {
while (left <= right) {
int a = left + arr[0];
int b = arr[left];
if (a != b) {
System.out.println(left + arr[0]);
return;
}
left++;
}
System.out.println(arr[right] + 1);
}
}
这里我也是好奇,改的不是1-N的最小可用id,而是数组第一个元素,到N的最小可用id;
这里先假定数组是有序的,若不是有序的话,也可以做下排序,然后判断数组中间的那个元素,是不是应该等于中值,
a是中间的元素,而b是期望的中值这里b加上的是数组的第一个元素,如果是从1开始的话,那么+1就行了,如果a==b,那就说明左边是整体有序的,那么就进入右半边进行查找,那么这里查找就很就很简单了,从右半边开始的第一个元素,一个个扫过去,如果碰到了一个不相等的值,就输出并return,如果while走完了,还没碰到,那就说明,最小可用id是最后一个+1