|
1 | 1 | # Time: O(n^2)
|
2 |
| -# Space: O(n^2) |
| 2 | +# Space: O(n) |
3 | 3 | #
|
4 | 4 | # Given a 2D binary matrix filled with 0's and 1's,
|
5 | 5 | # find the largest square containing all 1's and return its area.
|
|
13 | 13 | # Return 4.
|
14 | 14 | #
|
15 | 15 |
|
| 16 | +# DP with sliding window. |
16 | 17 | class Solution:
|
| 18 | + # @param {character[][]} matrix |
| 19 | + # @return {integer} |
| 20 | + def maximalSquare(self, matrix): |
| 21 | + if not matrix: |
| 22 | + return 0 |
| 23 | + |
| 24 | + m, n = len(matrix), len(matrix[0]) |
| 25 | + size = [[0 for j in xrange(n)] for i in xrange(2)] |
| 26 | + max_size = 0 |
| 27 | + |
| 28 | + for j in xrange(n): |
| 29 | + if matrix[0][j] == '1': |
| 30 | + size[0][j] = 1 |
| 31 | + max_size = max(max_size, size[0][j]) |
| 32 | + |
| 33 | + for i in xrange(1, m): |
| 34 | + if matrix[i][0] == '1': |
| 35 | + size[i % 2][0] = 1 |
| 36 | + else: |
| 37 | + size[i % 2][0] = 0 |
| 38 | + for j in xrange(1, n): |
| 39 | + if matrix[i][j] == '1': |
| 40 | + size[i % 2][j] = min(size[i % 2][j - 1], \ |
| 41 | + size[(i - 1) % 2][j], \ |
| 42 | + size[(i - 1) % 2][j - 1]) + 1 |
| 43 | + max_size = max(max_size, size[i % 2][j]) |
| 44 | + else: |
| 45 | + size[i % 2][j] = 0 |
| 46 | + |
| 47 | + return max_size * max_size |
| 48 | + |
| 49 | + |
| 50 | +# Time: O(n^2) |
| 51 | +# Space: O(n^2) |
| 52 | +# DP. |
| 53 | +class Solution2: |
| 54 | + # @param {character[][]} matrix |
| 55 | + # @return {integer} |
| 56 | + def maximalSquare(self, matrix): |
| 57 | + if not matrix: |
| 58 | + return 0 |
| 59 | + |
| 60 | + m, n = len(matrix), len(matrix[0]) |
| 61 | + size = [[0 for j in xrange(n)] for i in xrange(m)] |
| 62 | + max_size = 0 |
| 63 | + |
| 64 | + for j in xrange(n): |
| 65 | + if matrix[0][j] == '1': |
| 66 | + size[0][j] = 1 |
| 67 | + max_size = max(max_size, size[0][j]) |
| 68 | + |
| 69 | + for i in xrange(1, m): |
| 70 | + if matrix[i][0] == '1': |
| 71 | + size[i][0] = 1 |
| 72 | + else: |
| 73 | + size[i][0] = 0 |
| 74 | + for j in xrange(1, n): |
| 75 | + if matrix[i][j] == '1': |
| 76 | + size[i][j] = min(size[i][j - 1], \ |
| 77 | + size[i - 1][j], \ |
| 78 | + size[i - 1][j - 1]) + 1 |
| 79 | + max_size = max(max_size, size[i][j]) |
| 80 | + else: |
| 81 | + size[i][j] = 0 |
| 82 | + |
| 83 | + return max_size * max_size |
| 84 | + |
| 85 | + |
| 86 | +# Time: O(n^2) |
| 87 | +# Space: O(n^2) |
| 88 | +# DP. |
| 89 | +class Solution3: |
17 | 90 | # @param {character[][]} matrix
|
18 | 91 | # @return {integer}
|
19 | 92 | def maximalSquare(self, matrix):
|
|
0 commit comments