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

题目描述

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. 存在重复元素 简单 哈希
本文作者:
本文链接: https://hgnulb.github.io/blog/2021/26730924
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!