1、题目描述
2、分析
这道题的含义是,给出n个数字,这n个数字范围在0-n之间,0-n一共有n+1个数字,找出其中没有出现的数字。一开始想法就是排序,然后二分查找,但是这个不符合题目中的时间空间复杂度。还有一种方法,通过计算,首先计算给出的数字的和,再计算0-n的数字应该有的和,相减就是没有出现的数字,应该有的和可以用等差数列求和来计算。还有一种方法是用位操作,异或的特性,将少了一个数的组合和完整的数异或一下,剩下的就是少的数字。
3、代码
//求和相减
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum=0,n=nums.size();
for(auto a:nums)
sum+=a;
return 0.5*n*(n+1)-sum;
}
};
//二分查找
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int left=0,right=nums.size();
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]>mid) right=mid;
else left=mid+1;
}
return right;
}
};
//位操作
class Solution {
public:
int missingNumber(vector<int>& nums) {
int res=0;
for(int i=0;i<nums.size();++i){
res^=(i+1)^nums[i];
}
return res;
}
};
4、相关知识点
位操作的方法尤其是异或,在寻找缺失数字,比较数字等方面可能都会有奇效。