如果该行或列包含 0,则将矩阵中的每个单元格设置为 0
Posted
技术标签:
【中文标题】如果该行或列包含 0,则将矩阵中的每个单元格设置为 0【英文标题】:Set every cell in matrix to 0 if that row or column contains a 0 【发布时间】:2010-09-25 06:04:04 【问题描述】:给定一个包含 0 和 1 的 NxN 矩阵。将包含0
的每一行设置为所有0
s,并将包含0
的每一列设置为所有0
s。
例如
1 0 1 1 0
0 1 1 1 0
1 1 1 1 1
1 0 1 1 1
1 1 1 1 1
结果
0 0 0 0 0
0 0 0 0 0
0 0 1 1 0
0 0 0 0 0
0 0 1 1 0
一位 Microsoft 工程师告诉我,有一个解决方案不涉及额外内存,只需两个布尔变量和一个 pass,所以我正在寻找答案。
顺便说一句,假设它是一个位矩阵,因此矩阵中只允许 1 和 0。
【问题讨论】:
嗯?什么是“当你遇到”?您以什么顺序遇到矩阵中的元素?如果你遇到所有的位,你不会得到所有的 0 吗? 好吧,你决定遇到元素的顺序是你的决定,问题是你必须只将正确的元素设置为 0。如果遇到所有位设置为 0,是的,矩阵仍将填充零。 什么是“合适的元素”?您是否给了两个矩阵,一个是“源”矩阵,一个是“目标”矩阵,并且您必须决定以何种顺序“遇到”元素以获得“目标”矩阵? 我认为你听错了“1 pass”的想法。它可以在 2 次通过中线性完成,无需额外的内存,只需 2 个布尔值 ;-) 所以我强烈认为这是他的意思的解决方案(见下文) 能否请您与您的朋友再次确认问题描述是否正确?我以为我可以用汉明码或奇偶校验位来做到这一点,但到目前为止我还没有成功,这个问题一直困扰着我。 :) 【参考方案1】:我不认为这是可行的。当您在第一个方格上并且它的值为 1 时,您无法知道同一行和同一列中其他方格的值是什么。所以你必须检查那些,如果有零,返回第一个方块并将其值更改为零。我建议分两遍进行——第一遍收集关于哪些行和列必须清零的信息(信息存储在一个数组中,所以我们使用了一些额外的内存)。第二遍更改值。我知道这不是您正在寻找的解决方案,但我认为这是一个实用的解决方案。您给出的限制使问题无法解决。
【讨论】:
我有几乎相同的解决方案(见下文),没有额外的数组。它是线性时间(但经过 2 次) @Piotr:是的,第二遍似乎不可避免。引入数组来存储我提出的行和列信息使算法更直接,也更快一点,因为检查和值更改更少。这是存储和效率之间的权衡。以上是关于如果该行或列包含 0,则将矩阵中的每个单元格设置为 0的主要内容,如果未能解决你的问题,请参考以下文章
匹配两列中的单元格值,如果匹配,则将另一个值复制到空白单元格