原题网址:https://leetcode.com/problems/maximal-square/
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0Return 4.
方法一:使用最小堆或有序映射。
public class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;
int max = 0;
int[] h = new int[matrix[0].length];
PriorityQueue<Integer> heap = new PriorityQueue<>();
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[i].length; j++) {
h[j] = matrix[i][j]=='0'? 0 : h[j] + 1;
}
int from = 0;
heap.clear();
for(int j=0; j<h.length; j++) {
if (h[j] <= max) {
from = j+1;
heap.clear();
} else {
heap.offer(h[j]);
int len = Math.min(j-from+1, heap.peek());
max = Math.max(max, len);
while (!heap.isEmpty() && heap.peek() <= j-from+1) heap.remove(h[from++]);
}
}
}
return max*max;
}
}
方法二:动态规划,关键在于如何表示当前位置的最大正方形!
public class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;
int m = matrix.length;
int n = matrix[0].length;
int[][] len = new int[m+1][n+1];
int max = 0;
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
if (matrix[i-1][j-1]=='1') {
len[i][j] = Math.min(len[i-1][j-1], Math.min(len[i-1][j], len[i][j-1])) + 1;;
}
max = Math.max(max, len[i][j]);
}
}
return max*max;
}
}
一个有价值的测试用例:
1101
1111
1111
1111