【发布时间】:2017-07-09 19:00:30
【问题描述】:
我一直在从事编码挑战,只是为了好玩,问题是这样的:
给定一个仅包含数字的矩形矩阵,计算其中不同的 2 × 2 正方形的数量。
2x2 矩阵可能重叠。输入最多可以是 100 x 100 矩阵,并且是矩形,但不一定是正方形。我能够使用嵌套循环解决这个问题,问题是对于大型矩阵的输入来说太慢了,并且超过了编码挑战的时间限制(4000 毫秒)。我最初就是这样解决的。
def differentSquares(matrix)
i = 0
squares = []
while i < matrix.length - 1
j = 0
while j < matrix[i].length - 1
current = [matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]]
squares << current if !squares.include?(current)
j += 1
end
i += 1
end
squares.length
end
我考虑过以某种方式使用哈希,因为它们的迭代速度比数组快得多,但我不知道该怎么做。谁能帮我找到一个比嵌套循环更快的实现?
输入和预期输出示例:
input:
[[2,5,3,4,3,1,3,2],
[4,5,4,1,2,4,1,3],
[1,1,2,1,4,1,1,5],
[1,3,4,2,3,4,2,4],
[1,5,5,2,1,3,1,1],
[1,2,3,3,5,1,2,4],
[3,1,4,4,4,1,5,5],
[5,1,3,3,1,5,3,5],
[5,4,4,3,5,4,4,4]]
expected output: 54
another input:
[[1,2,1],
[2,2,2],
[2,2,2],
[1,2,3],
[2,2,1]]
expected output: 6
【问题讨论】:
-
一些非常小的加速可能来自:使用
squares的集合。然后只需添加“当前”而不检查(设置将确保唯一性)。您还可以确保只调用一次“长度”(因为矩阵是矩形的)。但这不会减少很多时间,我猜。所以你需要找到一个更好的算法...... -
哇!我以前从未听说过 Set,但我试过了,它奏效了!谢谢帕斯卡,我真的很感激。我现在将更多地研究 Set 数据结构,感谢您向我介绍它。
-
能否举个输入输出的例子?
-
@Stefan 我更新了问题以包含示例。
-
我认为您对问题的描述可能需要一些改进,因为仅根据您的描述,我预计第二个示例的结果是 4,而不是 6。