LeetCode 442. Find All Duplicates in an Array

129 篇文章 0 订阅

Problem Statement

(Source) 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]

Solution

关键点: 1 ≤ a[i] ≤ n (n = size of array)。根据这点信息,可以想象: 从左向右扫描该数据时,对于每一个当前位置,把能成功(目标位置当前元素没有满足condition)放到目标位置(condition: index == arr[index] - 1) 的当前位置元素和目标位置的元素交换,直到不能交换为止,继续向前扫描。当上述扫描过程完毕时,再从前往后扫描一次该数组,不满足condition的位置的元素皆为目标duplicates。算法的时间复杂度为O(n),虽有两次扫描数组的过程,第一次扫描中的交换过程最多执行 n 次,扫描总时间复杂度为O(n);第二次扫描时间也是 O(n) 。所以总共的时间复杂度为O(n)。算法没有使用extra space,符合要求。

class Solution(object):
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums or len(nums) < 2:
            return []

        i, n = 0, len(nums)
        for i in xrange(n):
            while nums[i] != i + 1:
                if nums[nums[i] - 1] == nums[i]:
                    break
                j = nums[i] - 1
                nums[i], nums[j] = nums[j], nums[i]
                # Wrong swap below:
                # nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
        return [nums[i] for i in xrange(n) if nums[i] != i + 1]

[TODO]: What is “extra space”?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值