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)
。算法没有使用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”?