python--leetcode442. Find All Duplicates in an Array

来源:互联网 发布:gs与js防水涂料的区别 编辑:程序博客网 时间:2024/05/16 02:38

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example:

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

这一题乍一看来很简单,其实若是不考虑时间确实很简单,问题是题目要求了O(n)。

说句实话,我第一次提交的代码超时了,心痛。

先上这个代码吧:

class Solution(object):    def findDuplicates(self, nums):        """        :type nums: List[int]        :rtype: List[int]        """        res=[]        for i in range(len(nums)):            if nums.count(nums[i])==2 :res.append(nums[i])        res=list(set(res))        return ress=Solution()print(s.findDuplicates([4,3,2,7,8,2,3,1]))
第一眼感觉没问题,仔细一看会发现.count函数应该是有时间复杂度的。


不超时的解法思路:

仔细审题,题目说了 1 ≤ a[i] ≤ n (n = size of array) 。于是我们遍历list,每个元素只要出现一次,我们就把它对应的下标元素乘以-1.这样倘若其对应下标的元素已经为负数,说明该元素在此之前出现过一次。

没理解我说的意思的同学看看代码吧,逻辑比较清楚。代码如下:

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