leetcode 645. 错误的集合
给一个长度为N的数组nums,其中本来装着[1…N]这N个元素,无序。但是现在出现了一些错误,nums中的一个元素出现了重复,也就同时导致了另一个元素的缺失。请你写一个算法,找到nums中的重复元素和缺失元素的值。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
方法一:hash
先遍历一次数组,用一个hash表存储每个数字出现的次数,然后遍历一次[1,…N],看看哪个元素重复出现,哪个元素没有出现,就可以了.
空间复杂度O(N)
时间复杂度O(N)
方法二:利用索引
每个元素和数组索引有一个对应关系,如果元素中不存在重复元素和缺失元素,那么每一个元素就和唯一一个索引值对应.
现在有一个元素重复了,同时有一个元素缺失了,那么就会导致有两个元素对应到了同一个索引,而且会有一个索引没有元素与之对应.
通过将每个索引对应的元素变成负数,来表示这个索引被对应了一次.
例如:
nums=[1,2,2,4]
idx 0 1 2 3
nums -1 -2 2 -4
看代码
class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:
n = len(nums)
dup = -1
for i in range(n):
idx = abs(nums[i]) - 1
if nums[idx] < 0:
dup = abs(nums[i])
else:
nums[idx] *= -1
miss = -1
for i in range(n):
if nums[i] > 0:
miss = i + 1
return [dup, miss]
空间复杂度O(1)
时间复杂度O(N)