题目描述
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
方法1:
class Solution {
public:
/*
n是数组长度
我的想法:
设置一个数组a,初始化全0;
遍历nums,置数组a的第nums[i]为1;
再遍历数组a,找到缺失的那个数。
时间复杂度 O(n)
空间复杂度O(n),高了
*/
int missingNumber(vector<int>& nums) {
if(nums.size()==0) return 0;
int res;
vector<int> a(nums.size()+1,0);
for(int i :nums){
a[i]=1;
}
for(int i=0;i<nums.size();i++){
if(a[i]==0){
res=i;
break;
}
}
return res;
}
};
方法2:
class Solution {
public:
/*
n是数组长度
先遍历求和sum
然后等差数列求和-sum
时间复杂度 O(n)
空间复杂度O(1)
*/
int missingNumber(vector<int>& nums) {
if(nums.size()==0) return 0;
int sum=0;
for(int i :nums){
sum+=i;
}
int n=nums.size()+1;
return n*(n-1)/2-sum;
}
};
方法3:
class Solution {
public:
/*
n是数组长度
利用异或性质
a^b^b=a 等号之前和顺序无关
0^a=a
1^2^3^2^3=1
时间复杂度 O(n)
空间复杂度O(1)
*/
int missingNumber(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
ans ^= i; //nums[i]中和i只有一个数少了
ans ^= nums[i];
}
ans ^= nums.size(); //一直异或就是少的那个数
return ans;
}
};