【问题标题】:How to check if two identical array exist in a single two-dimensional array? [Swift]如何检查单个二维数组中是否存在两个相同的数组? [迅速]
【发布时间】:2017-11-24 19:53:51
【问题描述】:

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

感谢您的所有回答,我专注于 leetCode threeSum 问题,所以我没有发表任何评论。但是由于我是编程菜鸟,所以我的答案超出了时间限制。所以我实际上想找到重复的数组并删除所有重复项,并在多维数组中只留下一个唯一的数组。我根据@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
}

【问题讨论】:

  • 我相信你尝试过一些东西。 不要害羞——展示你的尝试! (所以它看起来不像是“给我代码”的问题。)

标签: arrays swift algorithm multidimensional-array


【解决方案1】:

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

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]

【讨论】:

    【解决方案2】:

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

    1. 遍历每一行并对其值进行排序。所以 1,2,3 会变成 123,3,2,1 也会变成 1,2,3。
    2. 现在将其存储在键值对中,即映射。所以你的键是 123,它会映射到数组 1,2,3 或 3,2,1。

    注意:- 您的键是所有已排序的元素组合在一起作为不带逗号的字符串。

    这样你就会知道二维数组中的数组对有多少是相同的。

    【讨论】:

      【解决方案3】:

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

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

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

      3) 现在你有了每个子数组的数组“散列”。如果数组有 2 个相同的子数组,那么它们必须具有相同的哈希码。找到所有具有相同哈希码的子数组对(再次使用哈希,或排序,......无论如何)。

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

      实际上,这种方法运行得非常快,尽管理论上它很慢。这是因为散列步骤会修剪大部分搜索空间,而且这个散列函数非常强大。我确信 99.99% 如果存在,具有相同哈希码的对应子数组对实际上会匹配。

      【讨论】:

        猜你喜欢
        • 2012-06-13
        • 1970-01-01
        • 2019-09-04
        • 2021-05-21
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2014-05-15
        相关资源
        最近更新 更多