【发布时间】:2017-06-28 05:09:10
【问题描述】:
我最近对一家公司进行了技术测试,我认为他们遇到了一个非常有趣的问题,即识别二进制矩阵中的形状。
本练习的目标是创建一种算法,该算法可以在二进制矩阵中找到最大的 X 形状并返回其长度。 X 是这样定义的: -A X 由两条等长的对角线组成,它们共享一个独特的点。 例如:
101
010
101
包含长度为 3 的有效 X,因此算法将返回 3。
1001
0110
0110
1001
不包含任何有效的 X,因此算法将返回 1,因为长度为 1 的 X 是单个 1。
我设法完成了这个练习,但我实现了一个非常混乱的算法,时间复杂度估计为 O(n3),这很糟糕,不适合非常大的矩阵。这种复杂性的很大一部分是我用来遍历矩阵的双 for 循环。
我可以做些什么来制作更简洁的算法?我问这个问题是出于个人兴趣,需要提高我的技能和实践思维。
【问题讨论】:
-
X 是否需要用零“勾勒”?或者(例如)是否将所有 1 的数组视为具有跨越整个网格的 X?
-
@ruakh 不需要用 0 来勾勒,只要满足 2 等于对角线共享一个唯一点的条件即可。
-
顺便说一下,我认为最干净的算法是O(n^3)。不要把“乱”和“慢”混为一谈!
-
我实际上经历了几次迭代,而且我现在的迭代速度有点快,我相信!长话短说,我检查了数组中的每个元素,当我找到一个 1 时,我尝试检查我可以将它的对角线扩展多少以检查可能的最大 X。
-
对角线相等的要求意味着两条对角线的长度相同,并且共享一个唯一的 1。为了清楚起见,我编辑了第一篇文章!