题意
一个长度为 n−1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 到 n−1
之内。
在范围 0
到 n−1 的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。
分析
由于只缺少一个数,且数组升序,因此数组有这样的区间单调性,前部分: nums[i] = i,后半部分: nums[i] != i
其中后半部分可能为空。利用这个性质做二分,找到第一个 nums[i] != i 的 i 即为答案。
边界情况特殊处理一下即可。
class Solution {
public:
int getMissingNumber(vector<int>& nums) {
if(nums.size() == 0)return 0;
return find(nums);
}
int find(vector<int>& nums){
int l = 0, r = nums.size()-1;
while(l < r){
int mid = l+r>>1;
if(nums[mid] != mid)r = mid;
else l = mid + 1;
}
if(nums[l] == l)return l + 1;
return l;
}
};