448. Find All Numbers Disappeared in an Array

来源:互联网 发布:浙江林业干部网络学堂 编辑:程序博客网 时间:2024/06/18 15:23


题意如下:

对于一个长度为n的数组,其内部元素均由1 ~ n组成,有些元素重复出现了2次,有些元素出现了1次,有些元素从未出现,求那些从未出现的元素。

要求:额外空间复杂度为O(1), 时间复杂度为O(n)


解法:

如果不考虑空间复杂度和时间复杂度,可以使用两层循环,统计每一个元素在数组中出现的次数,优点是好写,但是当数据量大时容易超时。

标志位法:用正负标志位,区分出现的元素和未出现的元素

从左向右遍历数组arr,假设当前遍历到 arr 的第 i 个元素,用一个变量 j 记录 | arr[i] | - 1,访问arr 的第 j 个元素,如果该元素为正,则把它变为负;否则不变。

最后,遍历一遍数组,如果某个位置上的元素为正,说明该位置从来没有被访问过。

图中,arr[4] 和 arr[5]上的值为正,表示5(5 = 4 +1)、6(6 = 5+1)从未在arr中出现过。


Python代码如下:

class Solution(object):    def findDisappearedNumbers(self, nums):        """        :type nums: List[int]        :rtype: List[int]        """        for i in range(len(nums)):            j = abs(nums[i]) - 1            nums[j] = -abs(nums[j])        return [i + 1 for i in range(len(nums)) if nums[i] > 0]        


0 0
原创粉丝点击