题目
思路一 排序
给数组排序,遍历数组,数组元素不等于下标的返回。
代码一
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]!=i)
return i;
}
return nums.size();
}
};
思路二 数组哈希
开一个n+1大小的bool类型的数组,如果nums中的元素出现了,就置为true。
代码二
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
vector<bool> numss(n+1);
for(int i=0;i<n;i++) numss[nums[i]]=true;
for(int i=0;i<=n;i++){
if(numss[i]==false)
return i;
}
return -1;
}
};
思路三 原地哈希
第一次遍历,交换元素,把nums[i]放到它应该在的位置上。第二次遍历,找到数组中下标和元素值不一样的元素,返回。
代码三
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
if(nums[i]!=i&&nums[i]<n){
swap(nums[i],nums[nums[i]]);
i--;
}
}
for(int i=0;i<n;i++){
if(nums[i]!=i)
return i;
}
return n;
}
};
思路四 作差法
计算这些数的和,用原本的和减去计算的和,就是相差的数。
代码四
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size(),sum=0;
for(int i=0;i<n;i++)
sum+=nums[i];
return n*(n+1)/2-sum;
}
};
思路五 异或
先计算从1到n的异或结果,再把nums中的元素与这个结果异或,最后留下来的结果就是只出现一次的数,也就是nums中遗漏的数。
代码五
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size(),res=0;
for(int x=1;x<=n;x++) res^=x;
for(int num:nums)
res^=num;
return res;
}
};