448.找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素要么出现两次,要么只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。
假定返回的数组不算在额外空间内。不使用额外空间,时间复杂度O(n)。
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
for n in nums:
nums[abs(n) - 1] = -abs(nums[abs(n) - 1])
return [i + 1 for i, n in enumerate(nums) if n > 0]
"""
正负号标记法
此解实际上是利用索引把数组自身当作哈希表处理
将 nums 中所有的数作为索引i,置 nums[i] 为负值。那么,仍为正数的位置即为(未出现过)消失的数字
原始数组:[4,3,2,7,8,2,3,1]
重置后为:[-4,-3,-2,-7,8,2,-3,-1]
结论:[8,2] 分别对应的index为[5,6](消失的数字)
[abs(n) - 1]:防止该数已经被修改为负
"""