找出所有重复数(442)

题目


一个长度为n的整数数组,其中的元素满足1 ≤ a[i] ≤ n。其中部分元素出现两次,另一部分出现一次。找出所有出现两次的元素。

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

例如

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]

分析


首先想到的是用一个集合记录已经出现过的元素,问题在于不能用额外空间,只能在现有数组上做文章。注意到元素的范围是[1, n],正好可以对应数组的下标[0, n-1],因此可以将出现过的元素减去1,得到数组下标,其对应的元素乘以-1的方法来记录。

算法


扫描所给数组nums每一个元素,进行以下操作:

  1. 元素取绝对值后减去1,得到下标i
  2. nums[i]为正,乘以-1,否则添加到结果中。

代码


class Solution(object):
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        ans = []
        for i, n in enumerate(nums):
            if nums[abs(n)-1] < 0:
                ans.append(abs(n))
            else:
                nums[abs(n)-1] *= -1
        return ans

你可能感兴趣的:(找出所有重复数(442))