题目描述:
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?
要求是O(n)的时间复杂度。
这道题要accept的话很简单,10s之内就能想到最基础的方法:新加一个数组nums_status,长度为nums.length+1
用于记录nums中每一个值的状态,再遍历nums,对应更新nums_status中的值,最后再遍历nums_status ,找出status与其他index不同的index,返回次index,时间复杂度为3*O(n),满足要求。
代码如下:
public int missingNumberS1(int[] nums) {
int missing=0;
int[]nums_status=new int[nums.length+1];
for(int i=0;i<nums_status.length;i++)
nums_status[i]=0;
for(int n:nums)
nums_status[n]=1;
for(int idx=0;idx<nums_status.length;idx++)
{
if (nums_status[idx]==0)
missing=idx;
}
return missing;
}
还可以用位运算解决这道题,好处是不用设置额外的空间保存status。用异或,把完整数组和缺失数组整到一起,最后由于相同数异或以后为0,只剩下missing的数字了。
public int missingNumberS3(int[]nums){
int sum=0;
for(int i=0;i<nums.length;i++)
{sum^=nums[i];
sum^=i;
}
sum^=nums.length;
return sum;
}
还有更巧妙的,用等差数列求和公式,算出完整数组的和,在减去缺失数组,得到答案
public int missingNumberS2(int[] nums) {
int sum=0;
for(int n:nums)
sum+=n;
return (0+nums.length)*(nums.length+1)/2-sum;
}