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?
今天再认真看这道题才发现之前的解法是错误的
public int missingNumber(int[] nums) {
Arrays.sort(nums);
int i = 0;
while(i<nums.length){
if(nums[i] != i) return i;
i++;
}
return i;
}
排序的时间复杂度是O(nlgn),而且Arrays.sort的空间复杂度也不是O(1)
修改为如下代码,时间复杂度O(n) (每个数字都会被最多操作一次,即放置到正确的位置上)
public int missingNumber(int[] nums) {
for (int i=0; i<nums.length; i++) {
while (nums[i] != i && nums[i] != nums.length) {
swap(nums, i, nums[i]);
}
}
for (int i=0; i<nums.length; i++) {
if (nums[i] != i) {
return i;
}
}
return nums.length;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
一是二分查找,但是这需要保证输入是有序的
二是先算sum=n(n+1)/2,然后逐个做差,剩下的就是missing num,但是如果数组的数字比较大,求和会overflow
最后一种是位运算,比较好,如下
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.
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;
}
本文介绍了一种在给定数组中找到缺失数字的有效算法。该算法通过原地交换元素达到线性时间复杂度O(n)且空间复杂度O(1)。此外还探讨了排序、求和及位运算等其他解决方案。

348

被折叠的 条评论
为什么被折叠?



