【问题标题】:Largest contiguous square submatrix of "true" elements“真实”元素的最大连续方形子矩阵
【发布时间】:2012-07-29 19:19:44
【问题描述】:

这是一个面试问题:给定一个布尔矩阵,找出最大的连续方形子矩阵的大小,该子矩阵仅包含“真实”元素。

我在 SO 上找到了这个 question,但不明白答案。所提出的算法将一条对角线从左上角移动到右下角,并随着线的移动跟踪“真实”元素的矩形。

我的问题:

  • 如何在算法中跟踪矩形?
  • 为什么要移动 diagonal 线?如果我们移动垂直/水平线或同时移动两者会怎样?
  • 如何计算算法复杂度?

【问题讨论】:

  • @SINTER 谢谢。答案中最有趣的部分还不清楚。他们说 square 子矩阵有一个 O(N*N) 的 DP 解决方案,但没有详细说明。我想这正是我正在寻找的。​​span>

标签: algorithm language-agnostic matrix


【解决方案1】:

我无法理解the answer in the link you posted,而且我不认为那里的复杂性最适合您的问题。 (它声称有一个O(N^(3/2)*logN) 算法,其中N=n*n 是原始矩阵中的元素数。)

对于你最大的square子矩阵问题,有一个DP算法,其复杂度与元素的数量成线性关系:

设原矩阵为A[n][n],我们试图找到一个矩阵B[n][n],其中B[i][j]表示右下元素为A[i][j]的最大方形子矩阵的大小。所以

for (i = 0 ; i < n ; ++i)
  for (j = 0 ; j < n ; ++j) 
    if (A[i][j] == 0) B[i][j] = 0;
    else {
      if (B[i-1][j] != B[i][j-1]) {
        B[i][j] = min(B[i-1][j], B[i][j-1]) + 1
      } else {
        if (A[i-B[i-1][j]][j-B[i-1][j]] == 1)
          B[i][j] = B[i-1][j] + 1;
        else
          B[i][j] = B[i-1][j];
      }
    }

最大的 B[i][j] 就是答案。

附言为了简化,我没有检查数组范围。您可以只考虑超出范围的元素为零。

【讨论】:

  • 太棒了!非常感谢。看起来像我正在寻找的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2020-06-05
  • 2015-08-14
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多