📌  相关文章
📜  查找范围 [1, N] 中不存在于给定数组中的所有数字(1)

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

题目介绍

假设有一个长度为 n 的数组 nums,数组中的数字取值范围在 [1, n] 之间,但是其中可能存在一些数字没有出现在 nums 中,请编写一个函数找出其中没有出现在 nums 中的所有数字。

解题思路

方法一:哈希表

可以使用一个哈希表来快速统计数组中的每个数字出现的次数。然后遍历从 1 到 n 的每个数字,检查它是否出现在哈希表中。如果某个数字没有出现在哈希表中,则说明它没有出现在数组 nums 中。

时间复杂度:O(n),空间复杂度:O(n)

方法二:原地修改数组

可以遍历一遍数组 nums,将出现的数字对应的位置上的数字变成其相反数。遍历完成后,再次遍历数组,将数组中正数对应的位置值即为没有出现在 nums 中的数字。

时间复杂度:O(n),空间复杂度:O(1)

代码示例

方法一:哈希表
def findDisappearedNumbers(nums: List[int]) -> List[int]:
    n = len(nums)
    counter = collections.Counter(nums)
    ans = []
    for i in range(1, n + 1):
        if counter[i] == 0:
            ans.append(i)
    return ans
方法二:原地修改数组
def findDisappearedNumbers(nums: List[int]) -> List[int]:
    n = len(nums)
    for i in range(n):
        idx = abs(nums[i]) - 1
        nums[idx] = -abs(nums[idx])
    ans = []
    for i in range(n):
        if nums[i] > 0:
            ans.append(i + 1)
    return ans

总结

本题要求找到 [1, n] 中没有出现在数组 nums 中的数字,使用哈希表可以保证时间复杂度为 O(n),但是需要额外的空间存储哈希表。原地修改数组的方法虽然没有使用额外的空间,但是修改数组可能会破坏输入数据,需要注意。