Skip to content

Commit 0e26fc4

Browse files
solves maximal square in java
1 parent 4c7b530 commit 0e26fc4

File tree

2 files changed

+17
-49
lines changed

2 files changed

+17
-49
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@
178178
| 217 | [Contains Duplicate](https://leetcode.com/problems/contains-duplicate) | [![Java](assets/java.png)](src/ContainsDuplicate.java) [![Python](assets/python.png)](python/contains_duplicate.py) | |
179179
| 219 | [Contains Duplicate II](https://leetcode.com/problems/contains-duplicate-ii) | [![Java](assets/java.png)](src/ContainsDuplicateII.java) [![Python](assets/python.png)](python/contains_duplicate_ii.py) | |
180180
| 220 | [Contains Duplicate III](https://leetcode.com/problems/contains-duplicate-iii) | [![Java](assets/java.png)](src/ContainsDuplicateIII.java) | |
181-
| 221 | [Maximal Square](https://leetcode.com/problems/maximal-square) | | |
181+
| 221 | [Maximal Square](https://leetcode.com/problems/maximal-square) | [![Java](assets/java.png)](src/MaximalSquare.java) | |
182182
| 222 | [Count Complete Tree Nodes](https://leetcode.com/problems/count-complete-tree-nodes) | [![Java](assets/java.png)](src/CountCompleteTreeNodes.java) | |
183183
| 223 | [Rectangle Area](https://leetcode.com/problems/rectangle-area) | | |
184184
| 225 | [Implement Stack using Queues](https://leetcode.com/problems/implement-stack-using-queues) | [![Java](assets/java.png)](src/MyStack.java) [![Python](assets/python.png)](python/implement_stack_using_queues.py) | |

src/MaximalSquare.java

+16-48
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,32 @@
11
// https://leetcode.com/problems/maximal-square
22
// T: O(m * n)
3-
// S: O(m * n)
3+
// S: O(n)
44

55
public class MaximalSquare {
66
public int maximalSquare(char[][] matrix) {
7-
final int rows = matrix.length, columns = matrix[0].length;
8-
final int[][] dp = new int[rows][columns];
9-
10-
assignFirstRowInDPMatrix(dp, matrix);
11-
assignFirstColumnInDPMatrix(dp, matrix);
12-
13-
int maxSideLen = contains1(dp) ? 1 : 0;
14-
15-
for (int row = 1 ; row < rows ; row++) {
16-
for (int column = 1 ; column < columns ; column++) {
17-
if (isOne(matrix[row][column])) {
18-
dp[row][column] = min(dp[row - 1][column], dp[row][column - 1], dp[row - 1][column - 1]) + 1;
19-
} else dp[row][column] = 0;
20-
maxSideLen = Math.max(maxSideLen, dp[row][column]);
7+
final int columns = matrix[0].length;
8+
final int[] dp = new int[columns + 1];
9+
int maxSideLength = 0, prev = 0, temp;
10+
11+
for (char[] row : matrix) {
12+
for (int column = 0; column < columns; column++) {
13+
temp = dp[column + 1];
14+
if (isOne(row[column])) {
15+
dp[column + 1] = min(dp[column + 1], dp[column], prev) + 1;
16+
} else dp[column + 1] = 0;
17+
maxSideLength = Math.max(maxSideLength, dp[column + 1]);
18+
prev = temp;
2119
}
2220
}
2321

24-
return maxSideLen * maxSideLen;
25-
}
26-
27-
private boolean contains1(int[][] dp) {
28-
return contains1InFirstRow(dp) || contains1InFirstColumn(dp);
29-
}
30-
31-
private boolean contains1InFirstRow(int[][] dp) {
32-
for (int element : dp[0]) {
33-
if (element == 1) return true;
34-
}
35-
return false;
36-
}
37-
38-
private boolean contains1InFirstColumn(int[][] dp) {
39-
for (int[] row : dp) {
40-
if (row[0] == 1) return true;
41-
}
42-
return false;
43-
}
44-
45-
private boolean isOne(char character) {
46-
return character == '1';
22+
return maxSideLength * maxSideLength;
4723
}
4824

4925
private int min(int a, int b, int c) {
5026
return Math.min(a, Math.min(b, c));
5127
}
5228

53-
private void assignFirstRowInDPMatrix(int[][] dp, char[][] matrix) {
54-
for (int column = 0 ; column < matrix[0].length ; column++) {
55-
dp[0][column] = matrix[0][column] - '0';
56-
}
57-
}
58-
59-
private void assignFirstColumnInDPMatrix(int[][] dp, char[][] matrix) {
60-
for (int row = 0 ; row < matrix.length ; row++) {
61-
dp[row][0] = matrix[row][0] - '0';
62-
}
29+
private boolean isOne(char c) {
30+
return c == '1';
6331
}
6432
}

0 commit comments

Comments
 (0)