leetcode442. 数组中重复的数据————一定条件下的脑筋急转弯

题目:

给定一个整数数组 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个数的其他数字(最多替换一次)”。

也就是在被替换并且范围条件下。

想起来知乎谈到的一个面试经典题:给定一个数组,有一对数据是重复的,请找出。

这面试题依然要用哈希表,因为范围未知。

猜你喜欢

转载自blog.csdn.net/weixin_37373020/article/details/80935879