如果我有这样的二维数组:[[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
}
答案 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)
我想到的一种简单易行的蛮力方法是:
注意: - 您的密钥是所有已排序的元素,它们组合在一起,不带逗号。
这样你就会知道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%如果存在,那么具有相同哈希码的相应子阵列实际上将匹配。