题目描述
一个长度为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
方法一(二分查找)
1.解题思路
二分查找很容易实现,但是细节不好把握。这道题首先要确定查找范围,0到n-1总共有n个数,但是数组中只给了n-1个数,所以查找范围为左边界low=0,右边界high=数组长度(n-1);然后是二分策略,当下标等于当前值时,肯定不是要找的数,左边界后移(low=mid+1),当下标不等于当前值时,可能是要找的数,也可能要找的数在左边,所以缩小右边界的同时,要包含当前下标(high=mid)。
2代码实现
class Solution {
public int missingNumber(int[] nums) {
int low=0,high=nums.length;
while(low<high){
int mid=low+(high-low)/2;
if(mid==nums[mid]){
low=mid+1;
}
else{
high=mid;
}
}
return low;
}
}
3.复杂度分析
- 时间复杂度:需要进行logn次二分,所以时间复杂度为O(logn)。
- 空间复杂度:不需要额外的内存空间,所以空间复杂度为O(1)。
剑指offer全集入口: 请戳这里