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]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
package leetcode;
public class Missing_Number_268 {
public int missingNumber(int[] nums) {
int n=nums.length;
int[] indexedNums=new int[n+1];
for(int i=0;i<n;i++){
int number=nums[i];
indexedNums[number]=1;
}
for(int i=0;i<n+1;i++){
if(indexedNums[i]==0){
return i;
}
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Missing_Number_268 m=new Missing_Number_268();
int[] nums=new int[]{0,1,3};
System.out.println(m.missingNumber(nums));
}
}
当然啦,大神怎么可以拘泥于一个方法呢?大神早就总结出4种方法啦!厉害厉害!
1.XOR
public int missingNumber(int[] nums) {
int xor = 0, i = 0;
for (i = 0; i < nums.length; i++) {
xor = xor ^ i ^ nums[i];
}
return xor ^ i;//最后i的值是nums.length,即与nums.length进行异或
}
The basic idea is to use XOR operation. We all know that a^b^b =a, which means two xor operations with the same number will eliminate the number and reveal the original number.
In this solution, I apply XOR operation to both the index and value of the array. In a complete array with no missing numbers, the index and value should be perfectly corresponding( nums[index] = index), so in a missing array, what left finally is the missing number.
2.SUM
public int missingNumber(int[] nums) { //sum
int len = nums.length;
int sum = (0+len)*(len+1)/2;
for(int i=0; i<len; i++)
sum-=nums[i];
return sum;
}
3.Binary Search
public int missingNumber(int[] nums) { //binary search
Arrays.sort(nums);
int left = 0, right = nums.length, mid= (left + right)/2;
while(left<right){
mid = (left + right)/2;
if(nums[mid]>mid) right = mid;
else left = mid+1;
}
return left;
}