数组中的矩形区域

时间:2010-09-18 13:11:53

标签: algorithm puzzle

给定一个N * N矩阵,其中1为0,并给出一个整数k,找到矩形区域的最佳方法是什么,使得它有k 1?

2 个答案:

答案 0 :(得分:3)

我可以用O(N ^ 3 * log(N))来做,但确定最好的解决方案更快。首先,创建另一个N * N矩阵B(初始矩阵为A)。 B的逻辑如下:

B[i][j] - is the number of ones on rectangle in A with corners (0,0) and (i,j).

您可以通过动态编程来评估B代表O(N ^ 2):B [i] [j] = B [i-1] [j] + B [i] [j-1] - B [i- 1] [j-1] + A [i] [j]。

现在用O(N ^ 4)迭代所有右下角(i = 1..N,j = 1..N,O(N ^ 2)),左边很容易解决这个问题-bottom(z = 1..j,O(N))和right-upper(t = 1..i,O(N))并且在B的帮助下得到该矩形中的1的数量: / p>

sum_of_ones = B[i][j] - B[i][z-1] - B[t-1][j] + B[t-1][z-1].

如果你得到了k:k == sum_of_ones,那就输出结果。

要使它成为N ^ 3 * log(N),你应该通过二分搜索找到右上方(所以不要只迭代所有可能的单元格。)

答案 1 :(得分:2)

考虑这个更简单的问题:

  

给定大小为N且仅包含值1和0的向量,找到其中恰好包含k值为1的子序列。

A成为给定的向量和S[i] = A[1] + A[2] + A[3] + ... + A[i],表示子序列A[1..i]中有多少1。

对于每个i,我们感兴趣的是存在j <= i S[i] - S[j-1] == k

我们可以使用以下关系在O(n)中使用哈希表找到它:

S[i] - S[j-1] == k => S[j-1] = S[i] - k

let H = an empty hash table
for i = 1 to N do
  if H.Contains (S[i] - k) then your sequence ends at i
  else
    H.Add(S[i])

现在我们可以使用它来解决O(N^3)中给定的问题:对于给定矩阵中的每个行序列(有O(N^2)个行序列),请考虑该序列来表示向量和将先前的算法应用于它。在矩阵的情况下,S的计算有点困难,但要弄清楚并不难。如果您需要更多详细信息,请与我们联系。

<强>更新 以下是假设k = 12

,算法如何对以下矩阵起作用
0 1 1 1 1 0
0 1 1 1 1 0
0 1 1 1 1 0

单独考虑第一行:

0 1 1 1 1 0

将它视为向量0 1 1 1 1 0并将算法应用于更简单的问题:我们发现没有子序列加起来为12,所以我们继续前进。

考虑前两行:

0 1 1 1 1 0
0 1 1 1 1 0

将它们视为向量0+0 1+1 1+1 1+1 1+1 0+0 = 0 2 2 2 2 0,并将算法应用于更简单的问题:同样,没有子序列加起来为12,所以继续。

考虑前三行:

0 1 1 1 1 0
0 1 1 1 1 0
0 1 1 1 1 0

将它们视为向量0 3 3 3 3 0并将算法应用于更简单的问题:我们发现从位置2开始到第5位结束的序列是解决方案。从这里我们可以通过简单的簿记获得整个矩形。