2017-06-21 158 views
-2

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

谢谢你所有的答案,我专注于leetCode threeSum问题,所以我没有留下任何评论。但由于我是一个编程noobie,我的答案超过了时间限制..所以我实际上想要找到重复的数组并删除所有重复项,并保留在多维数组中只有一个唯一的数组。我已经加入基于@奥列格的回答一些额外的代码,并认为我会把我的功能在这里:

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

我相信你尝试过* *不要害羞 - 显示你的尝试! (所以它看起来不像是一个“给我代码”的问题。) –

回答

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] 
0

一个简单且容易蛮力的办法,我想到的是:

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

注意: - 您的密钥是所有排序的元素组合在一起作为没有逗号的字符串。

这样你就会知道在一个2d数组里面有多少个数组对是如何相同的。

0

有一个非常高效的利用算法置换散列方法。

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

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

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

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

实际上,该方法运行速度非常快,即使理论上它非常慢。这是因为散列步骤会削减大部分搜索空间,而且这个散列函数超强。我相信99.99%,如果存在,具有相同散列码的相应子阵列对实际上将匹配。

相关问题