题目描述:
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
方法一:hash表
def findDisappearedNumbers(nums):
n = len(nums)
hash_dic = dict()
lst = []
# 以下为建立hash表的过程
for i in range(0,n):
hash_dic[nums[i]] = 1
i = i + 1
# 以下为查表 没有存储value的值 空缺的key就是消失的数字
for i in range(1,n+1):
if hash_dic.get(i) is None:
lst.append(i)
return lst
你能在不使用额外空间且时间复杂度为 O(n)
的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
方法二:引用Leetcode的某位大佬的解释
基于鸽笼原理,我们可以写如下代码:
# 鸽笼原理
def findDisappearedNumbers(nums):
lst = []
# nums=4 意味着说第4个笼子(数组3号位置)被占过了 那就将这个位置标记一下
for i in nums:
if nums[abs(i)-1]>0:
nums[abs(i)-1] = - nums[abs(i)-1]
print(nums)
# 依次查看数组 如果3号数组是负数说明4号笼子一定有鸽子
for j in range(0, len(nums)):
# 找没住过的
if nums[j] > 0:
lst.append(j+1)
return lst
由于上述两种方法下时间复杂度相同,故运行时间并没有优劣之分。