📜  具有O(1)空间的数组中的N 3个重复数(1)

📅  最后修改于: 2023-12-03 15:36:47.402000             🧑  作者: Mango

具有O(1)空间的数组中的N 3个重复数

在一组包含N个元素的数组中,每个元素的取值范围是[1, N]。其中,有三个元素出现了两次,其他元素只出现了一次。请找出这三个元素。

解法

因为要使用O(1)的空间,所以不能用哈希表等数据结构。

我们可以使用如下的方法:

  1. 对数组中的每个元素,将其对应的下标处的元素取相反数,即将A[i]设为-A[i]。
  2. 再次遍历数组,对于A[i]为负数的位置,表示i是出现两次的数之一,将其取正数。
  3. 最后再次遍历数组,找到A[i]为负数的位置,它对应的下标即为另外两个重复元素。

具体实现参见下面的代码片段。

代码
def find_duplicate_numbers(nums):
    res = []
    
    for i in range(len(nums)):
        index = abs(nums[i]) - 1
        if nums[index] > 0:
            nums[index] = -nums[index]
        else:
            res.append(abs(nums[i]))
            
    for i in range(len(nums)):
        if nums[i] < 0:
            nums[i] = -nums[i]
    
    for i in range(len(nums)):
        if nums[i] != i + 1:
            res.append(i + 1)
            res.append(nums[i])
            break
            
    return res
性能分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

由于只进行了三次遍历,没有使用任何额外的空间,所以时间和空间复杂度均为O(1)。