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;}
}