448. 找到所有数组中消失的数字

448. 找到所有数组中消失的数字

一、题目描述

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。

请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

二、解题思路

把数值 n 放到它应该在的位置 n - 1,最后再遍历一遍数组,如果 nums[i] != i + 1,就表明数字 i + 1 丢失了。

三、复杂度分析

  • 时间 O(n)
  • 空间 O(1)

四、参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 找到所有数组中消失的数字
*
* @param nums 数组
* @return 消失的数字
*/
private List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> result = new ArrayList<>(nums.length);
int n = nums.length;
for (int i = 0; i < n; i++) {
int t = nums[i] - 1;
while (0 <= t && t < n && nums[t] != nums[i]) {
// 循环交换到正确的位置
int temp = nums[t];
nums[t] = nums[i];
nums[i] = temp;
t = nums[i] - 1;
}
}
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
result.add(i + 1);
}
}
return result;
}
作者

jiaduo

发布于

2022-09-18

更新于

2023-04-02

许可协议