python--leetcode442. Find All Duplicates in an Array

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 res

s=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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值