给你一个含n个整数的数组nums,其中nums[i]在区间[1, n]内。请你找出所有在[1, n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。

示例 1

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]

示例 2

输入:nums = [1,1]
输出:[2]

解题

方法 1

先把1 - n的数字放在一个list中,然后遍历给定的数组,在list中直接删除数组中存在的元素,直接返回list即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
LinkedList<Integer> res = new LinkedList<>();
int len = nums.length;
for (int i = 1; i <= len; i++) {
res.add(i);
}
for (int i = 0; i < len; i++) {
res.removeFirstOccurrence(nums[i]);
}
return res;
}
}

方法 2

利用set 和 list,先把数组数据放到set集合里,从1-n遍历set里不包含的元素即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
int len = nums.length;
Set<Integer> set = new HashSet<>();
List<Integer> list = new ArrayList<>();

for (int num : nums) {
set.add(num);
}

for (int i = 1; i <= len; i++) {
if (!set.contains(i)) {
list.add(i);
}
}
return list;
}
}

方法 3

先对数组排序,用一个变量记录期望的数字,比较当前数字与期望数字,找出缺失的数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public List<Integer> findMissingNumbers(int[] nums) {
List<Integer> result = new ArrayList<>();
int n = nums.length;

int expectedSum = (n * (n + 1)) / 2;

int actualSum = 0;
for (int num : nums) {
actualSum += num;
}
int missingNumber = expectedSum - actualSum;
result.add(missingNumber);
return result;
}