# 题目
给定一个包含 [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) { |
# 最后
期望与你一起遇见更好的自己
