题目:
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入: [4,3,2,7,8,2,3,1] 输出: [2,3]
如果不给空间限制,那么哈希表扫描一次即可。
然而不用任何额外的空间就需要一些小技巧了。
通过网上其他人的方法,我发现使用了下标取负的方法。
代码简单的思路如下
def f(arr):
ans=[]
for a in arr:
arr[abs(a)-1]*=(-1)#第a-1个数字取负
if arr[abs(a)-1]>0:#说明是第二次遇到了,因为负负得正
ans.append(abs(a))#所以把这个数字放到解数组中
return ans
如同代码注释写的一样,思路就是负负得正。
很遗憾的是这个方法仅仅是特定题目下的特定解法,实质上题目的意思是:“我有1-n这n个数字,有几个数字被替换成这n个数的其他数字(最多替换一次)”。
也就是在被替换并且范围条件下。
想起来知乎谈到的一个面试经典题:给定一个数组,有一对数据是重复的,请找出。
这面试题依然要用哈希表,因为范围未知。