题目描述
题目链接:https://leetcode.cn/problems/missing-number-lcci/description/

题目与思路分析
目标分析
- 数组
nums包含从0到n的所有整数,但其中缺了一个。编写代码找出那个缺失的数字。 - 要求时间复杂度至多为 O(n)。
思路一:数组哈希
思想:
- 题目给出一个长度为
n的数组,元素取值范围为0 ~ n,且恰好缺失一个数。 - 新建一个长度为
n + 1的辅助数组v,下标表示数字本身,值表示是否出现过。 - 遍历原数组,将出现过的数字对应位置标记为
1。 - 再遍历辅助数组,第一个为
0的下标就是缺失的数字。
注意事项:
- 辅助数组长度必须是
nums.size() + 1,否则无法覆盖n。 - 访问
v[nums[i]]前要保证nums[i]一定在0 ~ n范围内。 - 时间复杂度为
O(n),空间复杂度为O(n)。
思路二:数学求和
思想:
- 如果
0 ~ n没有缺失,总和应为:total = n * (n + 1) / 2。 - 实际数组的元素之和记为
sum。 - 由于只缺失一个数,那么 missing = total - sum。
- 一次遍历即可算出答案。
注意事项:
n = nums.size(),而不是数组中最大值。- 使用
int时要注意是否可能溢出(本题数据范围安全)。 - 时间复杂度
O(n),空间复杂度O(1)。
思路三:位运算(异或)
思想:
- 异或的性质:
a ^ a = 0a ^ 0 = a
- 数组中包含
0 ~ n缺一个数,共n个数。 - 将数组中所有元素互相异或,再将
0 ~ n全部互相异或:- 出现两次的数字会互相抵消为
0
- 出现两次的数字会互相抵消为


