1.题目
LeetCode: 268. 丢失的数字
【easy】
2.解题
方法一:异或
分析题意,长为n的数组包含0到n的n个数,将所有数与数组下标进行异或操作,剩下的结果是多余的数组下标,即丢失的元素。
java:
class Solution {
public int missingNumber(int[] nums) {
int res = 0;
for (int i = 0; i < nums.length; i++) {
res = res ^ i ^ nums[i];
}
return res ^ nums.length;
}
}
时间复杂度:O(n)。这里假设异或运算的时间复杂度是常数的,总共会进行 O(n) 次异或运算,因此总的时间复杂度为 O(n)。
空间复杂度:O(1)。算法中只用到了 O(1) 的额外空间,用来存储答案。
方法二:数学
根据求和公式我们可以知道所有元素的和,遍历数组减去所有数,最后剩下的值便是结果。
class Solution {
public int missingNumber(int[] nums) {
int sum = nums.length * (nums.length - 1) / 2;
for (int num : nums) {
sum = sum - num;
}
return sum + nums.length;
}
}
时间复杂度:O(n)。
空间复杂度:O(1)。