448. Find All Numbers Disappeared in an Array


题意如下:

对于一个长度为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]
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值