从 0,1,2,...,n 这 n+1 个数中选择 n 个数,选择出的数字依然保持有序,找出这 n 个数中缺失的那个数,要求 O(n) 或 O(log(n)) 并尽可能小。
方法1:二分查找
过程如下:
I mid j
↓ ↓ ↓
[ 0, 1, 2, 3, 5, 6, 7 ] 此时a[mid]=mid,i=mid+1
I mid j
↓ ↓ ↓
[ 0, 1, 2, 3, 5, 6, 7 ] 此时a[mid] > mid,j=mid-1
I j
↓↓
[ 0, 1, 2, 3, 5, 6, 7 ] 此时i=j,得到结果为4
核心代码如下:
public int solve (int[] a) {
int i = 0, j = a.length - 1;
while(i <= j) {
int mid = (i + j) / 2;
if(a[mid] == mid) {
i = mid + 1;
} else{
j = mid - 1;
}
}
return i;
}