LeetCode 448. 找到所有数组中消失的数字
题目描述
思路分析
解法一:原地标记(推荐)
核心思路:
- 数组长度为 n,元素范围为 1..n。
- 遍历数组,将对应下标的元素置为负数,表示该数出现过。
- 再次遍历,仍为正数的位置即为缺失的数字。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示数组长度。
- 空间复杂度:O(1),不计输出列表。
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int idx = Math.abs(nums[i]) - 1;
if (nums[idx] > 0) {
nums[idx] = -nums[idx];
}
}
List<Integer> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
res.add(i + 1);
}
}
return res;
}
}
func findDisappearedNumbers(nums []int) []int {
for i := 0; i < len(nums); i++ {
idx := nums[i]
if idx < 0 {
idx = -idx
}
idx--
if nums[idx] > 0 {
nums[idx] = -nums[idx]
}
}
res := make([]int, 0)
for i, val := range nums {
if val > 0 {
res = append(res, i+1)
}
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 442. 数组中重复的数据 | 中等 | 原地标记 |
| 268. 丢失的数字 | 简单 | 原地标记 |
| 41. 缺失的第一个正数 | 困难 | 原地哈希 |
| 287. 寻找重复数 | 中等 | 原地思路 |
| 217. 存在重复元素 | 简单 | 哈希 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!