Skip to content

Commit 827ff3c

Browse files
committed
feat: update solution to lcci problem: No.17.23
No.17.23.Max Black Square
1 parent 55b9431 commit 827ff3c

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

lcci/17.23.Max Black Square/README.md

+22-4
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,35 @@
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38-
**方法一:前缀和 + 枚举**
38+
**方法一:预处理 + 枚举**
3939

40-
我们可以使用前缀和的方法预处理出每个位置向下和向右的连续 $1$ 的个数,记为 $down[i][j]$ 和 $right[i][j]$。
40+
我们可以预处理出每个位置 $(i, j)$ 向下和向右的连续 $0$ (黑色像素)的个数,记为 $down[i][j]$ 和 $right[i][j]$。递推公式如下:
4141

42-
然后我们枚举正方形的边长 $k$,从最大的边长开始枚举,然后枚举正方形的左上角位置 $(i, j)$,如果满足条件,那么返回 $[i, j, k]$。
42+
$$
43+
down[i][j] = \begin{cases}
44+
down[i + 1][j] + 1, & matrix[i][j] = 0 \text{ 且 } i + 1 < n \\
45+
1, & matrix[i][j] = 0 \text{ 且 } i + 1 = n \\
46+
0, & matrix[i][j] = 1
47+
\end{cases}
48+
$$
49+
50+
$$
51+
right[i][j] = \begin{cases}
52+
right[i][j + 1] + 1, & matrix[i][j] = 0 \text{ 且 } j + 1 < n \\
53+
1, & matrix[i][j] = 0 \text{ 且 } j + 1 = n \\
54+
0, & matrix[i][j] = 1
55+
\end{cases}
56+
$$
57+
58+
需要注意的是,由于 $down[i][j]$ 依赖于 $down[i + 1][j]$,而 $right[i][j]$ 依赖于 $right[i][j + 1]$,所以,我们在预处理 $down[i][j]$ 和 $right[i][j]$ 时,是从大到小枚举 $i$ 和 $j$ 的。
59+
60+
接下来,我们从大到小枚举正方形的边长 $k$,从小到大枚举正方形的左上角位置 $(i, j)$,如果满足 $down[i][j] \ge k$ 且 $right[i][j] \ge k$ 且 $right[i + k - 1][j] \ge k$ 且 $down[i][j + k - 1] \ge k$,说明我们找到了一个边长最大为 $k$ 且左上角位置为 $(i, j)$ 的黑方阵,直接返回 $[i, j, k]$ 即可。
4361

4462
如果枚举完所有的正方形都没有满足条件的,那么返回空数组。
4563

4664
<p><img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/lcci/17.23.Max%20Black%20Square/images/max_black_square.png" /></p>
4765

48-
时间复杂度 $O(m \times n \times \min(m, n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数
66+
时间复杂度 $O(n^3)$,空间复杂度 $O(n^2)$。其中 $n$ 是方阵的边长
4967

5068
相似题目:
5169

0 commit comments

Comments
 (0)