题目链接:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/
这个题第一眼感觉并不难,但仔细一看就会发现端倪,题目中要求的时间复杂度是O(n)比较正常,但是,额外的空间复杂度为常数级(O(1))这就注定了没法使用hashmap记录每个数出现的次数。
但是既然没办法用hashmap,那么我们怎样记录数据呢?
- 可以利用索引!
- 因为题目中说明了,每个数都在1到n(列表长度是n)之间,故不存在负数。
- 我们在遍历的时候,如果遇到1, 我们就在列表中把索引为0的数加上一个负号,表示该数已经遍历过了,如果以后在遍历数组的时候,发现对应的索引指定的值小于0,就说明该数已经出现一次,我们就把它记录到ans中
- 具体代码实现如下:
class Solution:
def findDuplicates(self, nums: List[int]) -> List[int]:
if len(set(nums)) == len(nums):
return []
ans = []
for i in range(len(nums)):
if nums[abs(nums[i]) - 1] < 0:
ans.append(abs(nums[i]))
else:
nums[abs(nums[i]) - 1] = -nums[abs(nums[i]) - 1]
return ans