📅  最后修改于: 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),但是需要额外的空间存储哈希表。原地修改数组的方法虽然没有使用额外的空间,但是修改数组可能会破坏输入数据,需要注意。