一、需求
-
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内;
-
在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字;
二、二分法
2.1 思路分析
- 根据排序数组,首先想到二分法;
- 首先将原数组划分为左、右数组,左数组满足nums[i] = i,右数组满足nums[i] != i,其中 i 是从0开始的下标,故缺失的数字就是右数组第一个元素对应的索引;
- 那么现在就是利用二分查找右数组的第一个元素,初始化略,当num[mid] == m时,说明元素还在右边,令 i = mid + 1,当nums[mid] != m时,因为不一定是右子数组的第一个元素,故令 j = mid - 1,这样不管是否为第一个元素,最后 i 就是要返回的;
2.2 代码实现
class Solution {
public int missingNumber(int[] nums) {
//规定区间左闭右闭
int i = 0;
int j = nums.length - 1;
while(i <= j) {
// int m = i + (j - i) / 2;
int m = (i + j) / 2;
if(nums[m] == m) {
i = m + 1;
} else {
j = m - 1;
}
}
return i;
}
}
2.3 复杂度分析
- 时间复杂度为,二分法对数级别的复杂度;
- 空间复杂度为,几个变量使用常数大小的额外空间;
三、学习地址
作者:Krahets