如何检查一个二维数组中是否存在两个相同的数组? [迅速]

时间:2017-06-21 18:53:07

标签: arrays swift algorithm multidimensional-array

如果我有这样的二维数组:[[1,2,3],[3,2,1],[4,9,3]],我希望能够找到那里是这个数组中的两个相同的数组,它们是[1,2,3]和[3,2,1]。我怎样才能做到这一点?

感谢您的所有答案,我专注于leetCode threeSum问题,所以我没有留下任何评论。但由于我是编程noobie,我的答案超出了时间限制..所以我实际上想找到重复的数组并删除所有重复项,并在多维数组中只留下一个唯一的数组。我根据@ Oleg的答案添加了一些额外的代码,并且认为我会将我的功能放在这里:

func removeDuplicates(_ nums: inout [[Int]] ) -> [[Int]]{
    let sorted = nums.map{$0.sorted()}
    var indexs = [Int]()

    for (pos,item) in sorted.enumerated() {
        for i in pos+1..<sorted.count {
            if item == sorted[i] {
                if nums.indices.contains(i){
                    indexs.append(i)
                }
            }
        }
    }
    indexs = Array(Set<Int>(indexs))
    indexs = indexs.sorted(by: {$0 > $1})

    for index in indexs{
        nums.remove(at: index)
    }

    return nums
}

3 个答案:

答案 0 :(得分:2)

我的解决方案非常简单易懂。

let input =  [[1,2,3], [3,2,1], [4,9,3]]

首先让我们对嵌套数组的所有元素进行排序。 (它给我们提高了一点效率。)

let sorted = input.map{$0.sorted()}

我们应该比较每个元素。

for (pos,item) in sorted.enumerated() {
    for i in pos+1..<sorted.count {
        if item == sorted[i] {
            print(input[pos])
            print(input[i])
        }
    }
}

输出:

[1, 2, 3]
[3, 2, 1]

答案 1 :(得分:0)

我想到的一种简单易行的蛮力方法是:

  1. 遍历每一行并对其值进行排序。因此1,2,3将成为123,3,2,1也将成为1,2,3。
  2. 现在将其存储在键值对中,即映射。所以你的密钥将是123,它将映射到数组1,2,3或3,2,1。
  3. 注意: - 您的密钥是所有已排序的元素,它们组合在一起,不带逗号。

    这样你就会知道2d数组中的数组对可能是一样的。

答案 2 :(得分:0)

使用置换散列方法有一种非常有效的算法。

1)预处理2-dim数组,使所有元素都是非负数。 (通过从所有元素中减去最小元素)

2)每个子阵列A: compute hash [A] = sum(base ^ A [i] |与子数组A的所有索引i)。选择base作为一个非常大的素数(例如1e9 + 7)。你可以在计算时忽略整数溢出问题,因为我们在这里只使用加法和乘法。

3)现在你有阵列&#34;哈希&#34;每个子阵列。如果数组有2个相同的子数组,则它们必须具有相同的哈希码。查找具有相同哈希码的所有子阵列对(再次使用哈希,或排序,......等等)。

4)对于每一对,再次检查这些子阵列是否实际匹配(排序和比较,......等等)。如果你能找到实际匹配的2个子数组,则返回true,否则返回false。

实际上,即使理论上这个方法非常慢,这种方法运行速度也非常快。这是因为散列步骤将修剪大部分搜索空间,并且此散列函数非常强大。我确信99.99%如果存在,那么具有相同哈希码的相应子阵列实际上将匹配。