leetcode448.找到所有数组中消失的数字

125 阅读1分钟

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]:防止该数已经被修改为负
"""