Missing Number
Given an array containing n distinct numbers taken from
0, 1, 2, ..., n, find the one that is missing from the array.For example,
Given nums =[0, 1, 3]return2.Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
4/10/2015 update
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i = 0;
while(i < nums.size()){
if(nums[i] == i || nums[i] == nums.size()){
i++;
}
else{
int tmp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = tmp;
}
}
for(int i = 0; i < nums.size(); i++){
if(i != nums[i]){
return i;
}
}
return nums.size();
}
};
The key to solve this problem is to put all the elements in right places. (make nums[i] = i). It’s just like a sort algorithm while runs in linear time. I set ‘tail’ variable to -1 to mark it as ’empty’.
//So the size of the array must be n?
//What's the space and time complexity requirements?
//
class Solution {
public:
int missingNumber(vector<int>& nums) {
int tail = -1;
int i = 0;
while(i < nums.size()){
//element is in the right place
if(nums[i] == i){
i++;
}
else{
//element is not in the right place
if(nums[i] == nums.size()){
int tmp = tail;
tail = nums[i];
nums[i] = tmp;
}
//empty slot
else if(nums[i] == -1){
i++;
}
else{
//swap
int tmp = nums[i];
nums[i] = nums[nums[i]];
nums[tmp] = tmp;
}
}
}
//check for tail
if(tail != -1 && tail != nums.size()){
//swap tail and nums[tail]
int tmp = tail;
tail = nums[tmp];
nums[tmp] = tmp;
}
//n is missing
if(tail == -1) return nums.size();
for(int i = 0; i < nums.size(); i++){
if(nums[i] != i) return i;
}
}
};
