一、题目描述
二、思路分析
分析
- 第一种想到的思路就是对数组排序。缺失的数组有三种情形,第一种是缺0,第二种是缺少中间的数字。第三种是缺n。其中第一种和第三种情形都很容易判断。第二种情形需要遍历数组,如果发现相邻数组元素 x 和 y 之间的差 y - x 是大于1的话,说明缺失了两者中间的数,记录,跳出循环。
- 第二种思路是借助 HashSet。首先把数组元素全部添加到 HashSet 中,然后看看 HashSet 中是否有0 ~ n-1 的数(HashSet 的查找效率是 O(1)级别的),如果没有则记录这个数,跳出循环。这里还需要注意缺失 n 的情况,一开始把返回结果初始化为 n 就好了。
- 第三种思路是高斯求和公式,如果忘记的同学可以去复习一下。求出 0 ~ n 的和 expected,再把数组的和求出来 actual,两者之差 expected - antual 即为缺失的数字。差为 0 说明是第一种情形,不为0说明是第二、第三种情形。
三、题解
-
缺失数字的实现
- 排序思路
class Solution { public int missingNumber(int[] nums) { Arrays.sort(nums); // 第一种情形 if (nums[0] != 0) { return 0; } // 第三种情形 int result = nums.length; for (int i = 0; i < nums.length - 1; i++) { // 第二种情形 if (nums[i + 1] - nums[i] > 1) { result = nums[i] + 1; break; } } return result; } }- HashSet
class Solution { public int missingNumber(int[] nums) { HashSet<Integer> set = new HashSet(); for (int num : nums) { set.add(num); } int result = nums.length; for (int i = 0; i < nums.length; i++) { if (!set.contains(i)) { result = i; break; } } return result; }
}
* 高斯求和公式
```java
class Solution {
public int missingNumber(int[] nums) {
int expected = nums.length * (nums.length + 1) / 2;
int actual = 0;
for (int i = 0; i < nums.length; i++) {
actual += nums[i];
}
return expected - actual;
}
}