题目:
给定一个包含n个数字到数组nums,其中有的数字出现多次,有的数字出现一次。且所有的数字都在1到n之间。求该数组中未出现1到n之间到哪些数字。要求:不能使用多余到空间,且只能用O(n)的复杂度。不考虑返回的数组所占空间。
解题思路:
考虑到要有O(n)的复杂度,则联系到用哈希存储方式,使用python中的字典。
代码1(python):
class Solution(object):
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if nums==[]:
return []
max_l = len(nums)
dict_l = {}
for i in nums:
if i not in dict_l:
dict_l[i]=1
output = []
for i in range(max_l):
if i+1 not in dict_l:
output.append(i+1)
return output
代码2(python):
class Solution(object):
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if nums==[]:
return []
max_l = len(nums)
for i in range(max_l):
count = abs(nums[i])
nums[count-1]=-abs(nums[count-1])
output = []
for i in range(max_l):
if nums[i] > 0 :
output.append(i+1)
return output
上述代码中,代码1使用了多余到空间。代码二没有用多余的空间。代码二将nums中包含所有数字对应位置的数都变为负数(即保留了数值信息,也标记了是否包含的信息),再遍历更新后的数组,为正的则是原数组未包含数据。