85. 最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
- 示例 1:
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
解释:最大矩形如上图所示。
- 示例 2:
输入:matrix = []
输出:0
- 示例 3:
输入:matrix = [[“0”]]
输出:0
- 示例 4:
输入:matrix = [[“1”]]
输出:1
- 示例 5:
输入:matrix = [[“0”,“0”]]
输出:0
提示:
- rows == matrix.length
- cols == matrix[0].length
- 0 <= row, cols <= 200
- matrix[i][j] 为 ‘0’ 或 ‘1’
解题思路
利用84. 柱状图中最大的矩形的代码,我们只需要将连续的1计算为高度,就和那题没什么区别了
代码
class Solution {public int maximalRectangle(char[][] matrix) {if(matrix.length==0) return 0;int[] h=new int[matrix[0].length];int res=0;for(int i=0;i<matrix.length;i++){for(int j=0;j<matrix[0].length;j++){if(matrix[i][j]=='0'){h[j]=0;}else h[j]++;}res=Math.max(res,largestRectangleArea(h));}return res;}public int largestRectangleArea(int[] heights) {Stack<Integer> stack=new Stack<>();int n=heights.length;int[] nh=new int[n+2];for(int i=0;i<n;i++)nh[i+1]=heights[i];int res=0;for(int i=0;i<n+2;i++){while(!stack.isEmpty()&&nh[i]<nh[stack.peek()]){int j=stack.pop(),h=nh[j];int w=i-stack.peek()-1;res=Math.max(res,h*w);}stack.push(i);}return res;}
}