一、题目描述
一个长度为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(log n)
class Solution {
public int missingNumber(int[] nums) {
if(nums[0]!=0) return 0;
int n = nums.length;
int left = 0,right = n-1;
while(left <= right){
int mid = left + ((right - left)>>1);
if(nums[mid]!=mid&&nums[mid-1]==mid-1)
return mid;
else if(nums[mid]==mid)
left = mid + 1;
else
right = mid - 1;
}
return n;
}
}
优化:
class Solution {
public int missingNumber(int[] nums) {
int left = 0,right = nums.length-1;
while(left <= right){
int mid = left + ((right - left)>>1);
if(nums[mid]==mid)
left = mid + 1;
else
right = mid - 1;
}
return left;
}
}
方法二:异或
如果数组无序,可使用异或
数组的长度为n-1,且数字范围都在0到n-1内,我们将数组中的n-1个数字与0到n-1共n个数依次进行异或,异或相同的数字得000,最后剩下来的就只有缺失的数字
时间复杂度:o(n)
class Solution {
public:
int missingNumber(vector<int>& nums) {
int res = nums.size();
for(int i = 0;i < nums.size();i++){
res ^= nums[i] ^ i;
}
return res;
}
};