# 题目
给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。
# 示例
# 示例 1
1 | 输入:nums = [3,0,1] |
# 示例 2
1 | 输入:nums = [0,1] |
# 示例 3
1 | 输入:nums = [9,6,4,2,3,5,7,0,1] |
# 示例 4
1 | 输入:nums = [0] |
# 提示
1 | n == nums.length |
# 进阶
你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?
# 相关题目
力扣(LeetCode)268.丢失的数字
https://leetcode-cn.com/
力扣(LeetCode)136. 只出现一次的数字
https://leetcode-cn.com/
力扣(LeetCode)287. 寻找重复数
https://leetcode-cn.com/
力扣(LeetCode)41. 缺失的第一个正数
https://leetcode-cn.com/
力扣(LeetCode)765. 情侣牵手
https://leetcode-cn.com/
# 分析
简单类型的题目。
先把题目读清楚:
区间 [0,n]
一共有 n+1
个数,而题目中说的是 [0,n]
是 n
个数的数组,所以只会少 1
个数字。
# 解法
# 解法一:排序
将数组 nums
进行排序,找到 nums[i]!=i
的位置,就是缺少的那个数。
1 | public int missingNumber(int[] nums) { |
# 解法二:额外数组
由于 [0,n]
是数字连续的。所以我们使用一个额外的 n+1
长度的数组 pos
。将 nums[i]
作为 pos
的索引赋值为 1
,从 1
开始遍历 pos
数组, pos[i]==0
即为少的那个数字。
1 | public int missingNumber(int[] nums) { |
# 解法三:数学计算
区间 [0,n]
是连续的数组,那么利用等差数列的性质可以算出来 n
个数的总和,减去 nums
数组中的元素,则就是少的那个数。
1 | public int missingNumber(int[] nums) { |
# 解法四:亦或
亦或计算使然。 a^a=0
, 0^a=a
.
所以将 0...n
和 nums[0...n]
进行亦或计算,则计算出来的值就是缺少的那个数。
1 | public int missingNumber(int[] nums) { |
# 最后
期望与你一起遇见更好的自己