0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
分析
如果遍历一遍,也可以过,时间复杂度是O(N)。
此题无坑,读题看到“有序”,想到二分解法,就来写写二分吧,时间复杂度O(logN)。
二分对于复杂的情况还是要好好分析的,毕竟一个实际的问题不可能是某一个算法本身的简单实例。
解法(二分解法)
int missingNumber(int* nums, int numsSize){
// 如果最高位的元素值和下标相同,则返回该元素值 + 1
if(nums[numsSize - 1] == numsSize - 1){
return numsSize;
}
// 当某一位的数字缺失之后,其后面的所有数字都会大于其下标
// 由此,此题的目的是找:元素值大于下标的第一个元素的下标值
// 时间复杂度 O(logN)
int left = 0,right = numsSize - 1;
while(left < right){
int mid = (right - left)/2 + left;
if(nums[mid] == mid){
left = mid+1;
}else{
//否则nums[mid] > mid
right = mid;
}
}
return right;
}