一、题目
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例 2:
输入:nums = [1,1,2]
输出:[1]
示例 3:
输入:nums = [1]
输出:[]
二、解题
思路:
1、题目要复杂度为O(n),且要求使用常量额外空间的算法,所以不能暴力解决,只能遍历一次数组
2、因为长度为n,且数组中的所有整数都在范围【1,n】内,所以可以想到将各个数放置到它对应的位置
3、放置结束后,再一次遍历数组,如果该位置上放置的数-1与其下标值不一一对应,说明该元素出现两次。
代码:
def findDuplicates(nums):
#判定特殊条件
if len(nums) == 1 or len(nums) == 0:
return []
res = []
#放置元素
for i in range(len(nums)):
#不停的交换元素直到需要交换的两个元素相等
while nums[i] != nums[nums[i]-1]:
temp = nums[nums[i]-1]
nums[nums[i]-1] = nums[i]
nums[i] = temp
#重新遍历数组
for i in range(len(nums)):
if nums[i]-1 != i:
res.append(nums[i])
return res
if __name__ == '__main__':
nums = [5,4,6,7,9,3,10,9,5,6]
print(findDuplicates(nums))
三、知识点
1、积累了新思路:遍历一次数组实现复杂度为O(n)