📜  门| Gate IT 2005 |问题18(1)

📅  最后修改于: 2023-12-03 15:12:38.749000             🧑  作者: Mango

门(Gate) IT 2005 - 问题18

问题描述

给定一个由 n 个整数构成的数组,数组中的每个整数都在 1 和 n 之间(包括 1 和 n)。请以任意顺序返回数组中缺失的所有数字和重复的所有数字。

示例
输入: nums = [1,2,2,4]
输出: [2,3]
输入: nums = [1,1]
输出: [1,2]
解法

该问题可以通过排序数组来解决。由于所有数字都是正的,因此遍历整个数组并将出现的每个数字标记到其他元素中(例如将元素从 nums[i] 变为 -nums[i])。如果某个数字已经出现过,则 nums[|nums[i]| - 1] 是负的。如果再次遇到相同数字,则将其添加到答案中。

随后,遍历整个数组,如果遇到了一个正数,则说明它没有出现过,将其下标加一并添加到答案中。

代码
def findDuplicates(nums):
    size = len(nums)
    res = []
    for i in range(size):
        index = abs(nums[i]) - 1
        if nums[index] < 0:
            res.append(index + 1)
        nums[index] = -nums[index]

    for i in range(size):
        if nums[i] > 0:
            res.append(i + 1)

    return res
复杂度分析
  • 时间复杂度:$O(n)$,其中 n 是数组的长度。
  • 空间复杂度:$O(1)$。