Skip to content

Commit cb43216

Browse files
committed
feat: add solutions to lc problem: No.0221. Maximal Square
1 parent 7eb91c4 commit cb43216

File tree

7 files changed

+304
-78
lines changed

7 files changed

+304
-78
lines changed

solution/0200-0299/0221.Maximal Square/README.md

+114-2
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,139 @@
4242
<li><code>matrix[i][j]</code> 为 <code>'0'</code> 或 <code>'1'</code></li>
4343
</ul>
4444

45-
4645
## 解法
4746

4847
<!-- 这里可写通用的实现逻辑 -->
4948

49+
动态规划。
50+
51+
`dp[i + 1][j + 1]` 表示以下标 `(i, j)` 作为正方形右下角的最大正方形边长。
52+
53+
`matrix[i][j] == '1'`, `dp[i + 1][j + 1] = min(dp[i][j + 1], dp[i + 1][j], dp[i][j]) + 1`,否则 `dp[i + 1][j + 1] = 0`
54+
5055
<!-- tabs:start -->
5156

5257
### **Python3**
5358

5459
<!-- 这里可写当前语言的特殊实现逻辑 -->
5560

5661
```python
57-
62+
class Solution:
63+
def maximalSquare(self, matrix: List[List[str]]) -> int:
64+
m, n = len(matrix), len(matrix[0])
65+
dp = [[0] * (n + 1) for _ in range(m + 1)]
66+
mx = 0
67+
for i in range(m):
68+
for j in range(n):
69+
if matrix[i][j] == '1':
70+
dp[i + 1][j + 1] = min(dp[i][j + 1], dp[i + 1][j], dp[i][j]) + 1
71+
mx = max(mx, dp[i + 1][j + 1])
72+
return mx * mx
5873
```
5974

6075
### **Java**
6176

6277
<!-- 这里可写当前语言的特殊实现逻辑 -->
6378

6479
```java
80+
class Solution {
81+
public int maximalSquare(char[][] matrix) {
82+
int m = matrix.length, n = matrix[0].length;
83+
int[][] dp = new int[m + 1][n + 1];
84+
int mx = 0;
85+
for (int i = 0; i < m; ++i) {
86+
for (int j = 0; j < n; ++j) {
87+
if (matrix[i][j] == '1') {
88+
dp[i + 1][j + 1] = Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
89+
mx = Math.max(mx, dp[i + 1][j + 1]);
90+
}
91+
}
92+
}
93+
return mx * mx;
94+
}
95+
}
96+
```
97+
98+
### **C++**
99+
100+
```cpp
101+
class Solution {
102+
public:
103+
int maximalSquare(vector<vector<char>>& matrix) {
104+
int m = matrix.size(), n = matrix[0].size();
105+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
106+
int mx = 0;
107+
for (int i = 0; i < m; ++i) {
108+
for (int j = 0; j < n; ++j) {
109+
if (matrix[i][j] == '1') {
110+
dp[i + 1][j + 1] = min(min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
111+
mx = max(mx, dp[i + 1][j + 1]);
112+
}
113+
}
114+
}
115+
return mx * mx;
116+
}
117+
};
118+
```
119+
120+
### **Go**
121+
122+
```go
123+
func maximalSquare(matrix [][]byte) int {
124+
m, n := len(matrix), len(matrix[0])
125+
dp := make([][]int, m+1)
126+
for i := 0; i <= m; i++ {
127+
dp[i] = make([]int, n+1)
128+
}
129+
mx := 0
130+
for i := 0; i < m; i++ {
131+
for j := 0; j < n; j++ {
132+
if matrix[i][j] == '1' {
133+
dp[i+1][j+1] = min(min(dp[i][j+1], dp[i+1][j]), dp[i][j]) + 1
134+
mx = max(mx, dp[i+1][j+1])
135+
}
136+
}
137+
}
138+
return mx * mx
139+
}
140+
141+
func max(a, b int) int {
142+
if a > b {
143+
return a
144+
}
145+
return b
146+
}
147+
148+
func min(a, b int) int {
149+
if a < b {
150+
return a
151+
}
152+
return b
153+
}
154+
```
65155

156+
### **C#**
157+
158+
```cs
159+
public class Solution {
160+
public int MaximalSquare(char[][] matrix) {
161+
int m = matrix.Length, n = matrix[0].Length;
162+
var dp = new int[m + 1, n + 1];
163+
int mx = 0;
164+
for (int i = 0; i < m; ++i)
165+
{
166+
for (int j = 0; j < n; ++j)
167+
{
168+
if (matrix[i][j] == '1')
169+
{
170+
dp[i + 1, j + 1] = Math.Min(Math.Min(dp[i, j + 1], dp[i + 1, j]), dp[i, j]) + 1;
171+
mx = Math.Max(mx, dp[i + 1, j + 1]);
172+
}
173+
}
174+
}
175+
return mx * mx;
176+
}
177+
}
66178
```
67179

68180
### **...**

solution/0200-0299/0221.Maximal Square/README_EN.md

+108-1
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,120 @@
4646
### **Python3**
4747

4848
```python
49-
49+
class Solution:
50+
def maximalSquare(self, matrix: List[List[str]]) -> int:
51+
m, n = len(matrix), len(matrix[0])
52+
dp = [[0] * (n + 1) for _ in range(m + 1)]
53+
mx = 0
54+
for i in range(m):
55+
for j in range(n):
56+
if matrix[i][j] == '1':
57+
dp[i + 1][j + 1] = min(dp[i][j + 1], dp[i + 1][j], dp[i][j]) + 1
58+
mx = max(mx, dp[i + 1][j + 1])
59+
return mx * mx
5060
```
5161

5262
### **Java**
5363

5464
```java
65+
class Solution {
66+
public int maximalSquare(char[][] matrix) {
67+
int m = matrix.length, n = matrix[0].length;
68+
int[][] dp = new int[m + 1][n + 1];
69+
int mx = 0;
70+
for (int i = 0; i < m; ++i) {
71+
for (int j = 0; j < n; ++j) {
72+
if (matrix[i][j] == '1') {
73+
dp[i + 1][j + 1] = Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
74+
mx = Math.max(mx, dp[i + 1][j + 1]);
75+
}
76+
}
77+
}
78+
return mx * mx;
79+
}
80+
}
81+
```
82+
83+
### **C++**
84+
85+
```cpp
86+
class Solution {
87+
public:
88+
int maximalSquare(vector<vector<char>>& matrix) {
89+
int m = matrix.size(), n = matrix[0].size();
90+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
91+
int mx = 0;
92+
for (int i = 0; i < m; ++i) {
93+
for (int j = 0; j < n; ++j) {
94+
if (matrix[i][j] == '1') {
95+
dp[i + 1][j + 1] = min(min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
96+
mx = max(mx, dp[i + 1][j + 1]);
97+
}
98+
}
99+
}
100+
return mx * mx;
101+
}
102+
};
103+
```
104+
105+
### **Go**
106+
107+
```go
108+
func maximalSquare(matrix [][]byte) int {
109+
m, n := len(matrix), len(matrix[0])
110+
dp := make([][]int, m+1)
111+
for i := 0; i <= m; i++ {
112+
dp[i] = make([]int, n+1)
113+
}
114+
mx := 0
115+
for i := 0; i < m; i++ {
116+
for j := 0; j < n; j++ {
117+
if matrix[i][j] == '1' {
118+
dp[i+1][j+1] = min(min(dp[i][j+1], dp[i+1][j]), dp[i][j]) + 1
119+
mx = max(mx, dp[i+1][j+1])
120+
}
121+
}
122+
}
123+
return mx * mx
124+
}
125+
126+
func max(a, b int) int {
127+
if a > b {
128+
return a
129+
}
130+
return b
131+
}
132+
133+
func min(a, b int) int {
134+
if a < b {
135+
return a
136+
}
137+
return b
138+
}
139+
```
55140

141+
### **C#**
142+
143+
```cs
144+
public class Solution {
145+
public int MaximalSquare(char[][] matrix) {
146+
int m = matrix.Length, n = matrix[0].Length;
147+
var dp = new int[m + 1, n + 1];
148+
int mx = 0;
149+
for (int i = 0; i < m; ++i)
150+
{
151+
for (int j = 0; j < n; ++j)
152+
{
153+
if (matrix[i][j] == '1')
154+
{
155+
dp[i + 1, j + 1] = Math.Min(Math.Min(dp[i, j + 1], dp[i + 1, j]), dp[i, j]) + 1;
156+
mx = Math.Max(mx, dp[i + 1, j + 1]);
157+
}
158+
}
159+
}
160+
return mx * mx;
161+
}
162+
}
56163
```
57164

58165
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int maximalSquare(vector<vector<char>>& matrix) {
4+
int m = matrix.size(), n = matrix[0].size();
5+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
6+
int mx = 0;
7+
for (int i = 0; i < m; ++i) {
8+
for (int j = 0; j < n; ++j) {
9+
if (matrix[i][j] == '1') {
10+
dp[i + 1][j + 1] = min(min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
11+
mx = max(mx, dp[i + 1][j + 1]);
12+
}
13+
}
14+
}
15+
return mx * mx;
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,19 @@
1-
// https://leetcode.com/problems/maximal-square/
2-
3-
using System;
4-
5-
public partial class Solution
6-
{
7-
public int MaximalSquare(char[][] matrix)
8-
{
9-
var lengthI = matrix.Length;
10-
var lengthJ = lengthI == 0 ? 0 : matrix[0].Length;
11-
if (lengthI == 0 || lengthJ == 0) return 0;
12-
13-
var lenI = new int[lengthI, lengthJ];
14-
var lenJ = new int[lengthI, lengthJ];
15-
var f = new int[lengthI, lengthJ];
16-
var maxSideLength = 0;
17-
for (var i = 0; i < lengthI; ++i)
1+
public class Solution {
2+
public int MaximalSquare(char[][] matrix) {
3+
int m = matrix.Length, n = matrix[0].Length;
4+
var dp = new int[m + 1, n + 1];
5+
int mx = 0;
6+
for (int i = 0; i < m; ++i)
187
{
19-
for (var j = 0; j < lengthJ ; ++j)
8+
for (int j = 0; j < n; ++j)
209
{
2110
if (matrix[i][j] == '1')
2211
{
23-
lenI[i, j] = i == 0 ? 1 : lenI[i - 1, j] + 1;
24-
lenJ[i, j] = j == 0 ? 1 : lenJ[i, j - 1] + 1;
25-
if (i == 0 || j == 0)
26-
{
27-
f[i, j] = 1;
28-
}
29-
else
30-
{
31-
f[i, j] = Math.Min(Math.Min(f[i - 1, j - 1] + 1, lenI[i, j]), lenJ[i, j]);
32-
}
33-
if (f[i, j] > maxSideLength) maxSideLength = f[i, j];
12+
dp[i + 1, j + 1] = Math.Min(Math.Min(dp[i, j + 1], dp[i + 1, j]), dp[i, j]) + 1;
13+
mx = Math.Max(mx, dp[i + 1, j + 1]);
3414
}
3515
}
3616
}
37-
38-
return maxSideLength * maxSideLength;
17+
return mx * mx;
3918
}
4019
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func maximalSquare(matrix [][]byte) int {
2+
m, n := len(matrix), len(matrix[0])
3+
dp := make([][]int, m+1)
4+
for i := 0; i <= m; i++ {
5+
dp[i] = make([]int, n+1)
6+
}
7+
mx := 0
8+
for i := 0; i < m; i++ {
9+
for j := 0; j < n; j++ {
10+
if matrix[i][j] == '1' {
11+
dp[i+1][j+1] = min(min(dp[i][j+1], dp[i+1][j]), dp[i][j]) + 1
12+
mx = max(mx, dp[i+1][j+1])
13+
}
14+
}
15+
}
16+
return mx * mx
17+
}
18+
19+
func max(a, b int) int {
20+
if a > b {
21+
return a
22+
}
23+
return b
24+
}
25+
26+
func min(a, b int) int {
27+
if a < b {
28+
return a
29+
}
30+
return b
31+
}

0 commit comments

Comments
 (0)