Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何检查单个二维数组中是否存在两个相同的数组?[快速]_Arrays_Swift_Algorithm_Multidimensional Array - Fatal编程技术网

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

Arrays 如何检查单个二维数组中是否存在两个相同的数组?[快速],arrays,swift,algorithm,multidimensional-array,Arrays,Swift,Algorithm,Multidimensional Array,如果我有一个这样的二维数组:[[1,2,3],[3,2,1],[4,9,3],我想知道在这个数组中有两个相同的数组,它们是[1,2,3]和[3,2,1]。我怎样才能做到这一点 谢谢你的回答,我一直在关注leetCode三和问题,所以我没有留下任何评论。但是由于我是编程高手,我的答案超过了时间限制。。所以我实际上想找到重复的数组,删除所有重复的数组,在多维数组中只留下一个唯一的数组。我已经根据@Oleg的答案添加了一些额外的代码,我想我应该把我的函数放在这里: func removeDuplica

如果我有一个这样的二维数组:[[1,2,3],[3,2,1],[4,9,3],我想知道在这个数组中有两个相同的数组,它们是[1,2,3]和[3,2,1]。我怎样才能做到这一点

谢谢你的回答,我一直在关注leetCode三和问题,所以我没有留下任何评论。但是由于我是编程高手,我的答案超过了时间限制。。所以我实际上想找到重复的数组,删除所有重复的数组,在多维数组中只留下一个唯一的数组。我已经根据@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
}
func删除的副本(nums:inout[[Int]])->[[Int]]{
设sorted=nums.map{$0.sorted()}
变量索引=[Int]()
对于排序的.枚举()中的(位置,项目){
对于pos+1中的i..$1})
用于索引中的索引{
nums.remove(在:索引处)
}
返回nums
}

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

  • 迭代每一行并对其值进行排序。所以1,2,3会变成123,3,2,1也会变成1,2,3
  • 现在将其存储在一个键值对中,即映射。因此,您的密钥将是123,它将映射到数组1,2,3或3,2,1
  • 注意:-您的键是作为字符串组合在一起的所有已排序元素,不带逗号


    通过这种方式,您将知道二维阵列中的阵列对是如何相同的

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

    let input =  [[1,2,3], [3,2,1], [4,9,3]]
    
    首先让我们对嵌套数组的所有元素进行排序。(这给了我们更高的效率。)

    然后我们应该比较每个元素

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

    3) 现在您有了每个子数组的数组“hash”。如果数组有两个相同的子数组,则它们必须具有相同的哈希代码。查找具有相同哈希代码的所有子数组对(再次使用哈希,或排序,…无论什么)

    4) 对于每一对,再次检查这些子数组是否匹配(排序和比较,…无论什么)。如果可以找到实际匹配的2个子数组,则返回true,否则返回false

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

    我确信您尝试了一些方法。不要害羞——展示你的尝试!(这样看起来就不像是“给我代码”的问题。)
    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]