题目:
这个题我是用二分法写的:下面是代码,这个就是一个正常的二分过程,只不过,最后的值由left给出,这点通过模拟几次例子就可以得到:当left>right时,那个left就是缺失的数。
这个思路题解里面也有一位大佬给出了,看到他的解释,我才明白,这个题又是一类二分法的基础题型。我把他的题解附在这里。
法一
复杂度分析:
时间复杂度 O(log N)O(logN): 二分法为对数级别复杂度。
空间复杂度 O(1)O(1): 几个变量使用常数大小的额外空间。
int missingNumber(int* nums, int numsSize){
int flag=0;
int left=0 ;
int right = numsSize -1;
int mid;
while(left <=right) {
mid = left + (right - left)/2;
if (nums[mid] == mid) {
left = mid + 1;
} else if (nums[mid] > mid) {
right = mid - 1;
}
}
return left;
}
这是执行结果。
法二:
还有一种解题方法就是找规律,忽略掉本身这个题在考二分,直接用一遍遍历,找到第一个nums[i]!=[i]的值就好了。最后执行效率也挺高的。