Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.
Example 1:
Input: [3,0,1]
Output: 2
Example 2:
Input: [9,6,4,2,3,5,7,0,1]
Output: 8
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
1.不停地交换即可。因为0-n一共n+1个数,但是数组大小只有n,所以可以push_back()一个-1标记。然后只需把大小为a的数字放到数组第a个位置,那么最后所有的数字都在对应的位置上。只有那个不存在的数字位置上是-1。
class Solution {
public:
int missingNumber(vector<int>& nums) {
nums.push_back(-1);
int n=nums.size(),i;
for(i=0;i<n;i++){
while(nums[i]!=i&&nums[i]!=-1){
swap(nums[i],nums[nums[i]]);
}
}
int ans;
for(i=0;i<n;i++){
if(nums[i]==-1){
ans=i;
break;
}
}
return ans;
}
};
2.加减法
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int sum=(1+n)*n/2;
for(int i=0;i<n;i++){
sum=sum-nums[i];
}
return sum;
}
};
3.异或
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int ans=n;
for(int i=0;i<n;i++){
ans=ans^i^nums[i];
}
return ans;
}
};