题目:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路:
1.最直观的方法就是直接数学计算,把0~n-1的和算一遍记作a,再把数组内的数字的和算一遍记作b;用a-b就可以得到没有在数组中的这个数。
2.索引与值匹配 ,首先我想到了数组元素的值就是索引的位置 ,那么第一个索引的值与索引不匹配的话,它就是缺失的数值
代码实现:
int missingNumber(int* nums, int numsSize){
int i;
for(i = 0; i < numsSize; i++){
if(nums[i] != i)
break;
}
return i;
}
3.观察数组,存在排序的特性,所以潜意识我们可以先想到二分查找,然后想想如果这个数组里不缺那个数字,是不是就是每个数的下标和它的值就相等,一旦缺了一个数,就代表从某个位置它的值开始大于它的下标值,所以结合二分查找,我们就可以看中间元素的值和下标相不相等。相等就去它的后边找,不相等就去它的前面找。
代码实现:
int missingNumber(int* nums, int numsSize){
int low, mid, high;
low = 0, high = numsSize-1;
while(low < high){
mid = (low+high)/2;
if(nums[mid] > mid)
high = mid - 1;
else if(nums[mid] == mid)
low = mid + 1;
}
if(nums[low] != low)
return low;
else
return high+1;
}