我有2行和n列。 我必须找到将1与其他1分开所需的最小行数。例如:
设n = 6
0 0 1 0 1 1
1 0 0 1 0 1
我需要在这两行之间画一条水平线。 索引之后的2条垂直线(从0开始)2,在索引4之后直到底部。
总线数= 1 + 2 = 3.
注意,行可以是任意长度,即它可以是一列的长度,但行数应该是最小的,每个1(矩阵的数量)应该与其他1分开。
另一个澄清这一点的例子:
设n = 7
1 0 1 0 0 1 1
0 1 0 0 1 0 0
在这个例子中,我需要1条水平线和2条垂直线。 索引1之后的一条垂直线和索引5之后的另一条垂直线(长度等于列的行)。
总线数= 1 + 2 = 3.
请为我提供时间复杂度最低的解决方案。
答案 0 :(得分:1)
似乎水平线是最佳解决方案的一部分,每当两行至少有一个1时(也有最佳解决方案只有垂直线的情况,但你总是可以切换其中一个垂直线水平线)。因此我们可以将其视为给定(另一种情况易于检测且易于解决)。
然后,你真的没有多少选项可以放置多少行。这使得它很容易解决。从左到右同时遍历行。每当遇到1时,检查是否需要放线。这是一些伪代码:
topRowHas1 := false
bottomRowHas1 := false
lines := 1 //the horizontal line
for location from 0 to n - 1 (inclusive)
if (topRow[location] == 1 && topRowHas1) || (bottomRow[location] == 1 && bottomRowHas1)
//we have to add a vertical line
lines++
topRowHas1 := false
bottomRowHas1 := false
end if
topRowHas1 |= topRow[location] == 1
bottomRowHas1 |= bottomRow[location] == 1
next
这是你的例子的执行
0 0 1 0 1 1
1 0 0 1 0 1
location topRowHas1 bottomRowHas1 lines
------------------------------------------
false false 1
0 false true 1
1 false true 1
2 true true 1
3 false false 2 //vertical line here
false true 2
4 true true 2
5 false false 3 //vertical line here
true true 3
所以我们有一条水平线,一条在位置3之前的垂直线,一条垂直线在位置5之前。