数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
方法一:
暴力。
- 排序,直接对比查找
- 由于数组中缺失了0 - n中的一个数字,也就是说,长度为 n - 1
- 排序后,对比其下标和对应的值。找到了就返回,否则就是n
代码:
class Solution {
public int missingNumber(int[] nums) {
// 0 - n中间缺一个数字,那就说明nums.length是 n - 1 要不然无法缺一个。
Arrays.sort(nums);
int i = 0;
for (i = 0; i < nums.length; i++) {
if (i != nums[i]) return i;
}
return i;
}
}
时间复杂度:O(nlgn)
空间复杂度:O(lgn) 排序消耗的
方法二:
使用位运算,异或运算符。
- 两个相同的值异或运算,结果为0
- 0和任意值做异或运算,结果为任意值。
- 那么把数组中的数字0 - (n - 1)和对应的下标做一个异或运算,由于题目说明,一定会缺少一个,那么最后剩下的值,就是结果。
代码:
class Solution {
public int missingNumber(int[] nums) {
// 异或
int res = 0;
for (int i = 0; i < nums.length; i++) {
res ^= i;
res ^= nums[i];
}
res ^= nums.length;
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(1)