LeetCode Maximal rectangle
2016-08-10 20:17
405 查看
动态规划。我自己第一遍做没做出来,上网搜了一下答案,发现是用的之前合并方块的思路做得。
就是这样。每次统计每行累计1的个数,然后计算出每行的最大直方图面积。
那么代码是如下所示:
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix==null || matrix.length==0 || matrix[0].length==0)
{
return 0;
}
int maxArea = 0;
int[] height = new int[matrix[0].length];
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
{
height[j] = matrix[i][j]=='0'?0:height[j]+1;
}
maxArea = Math.max(largestRectangleArea(height),maxArea);
}
return maxArea;
}
public int largestRectangleArea(int[] height) {
if(height==null || height.length==0)
{
return 0;
}
int maxArea = 0;
LinkedList<Integer> stack = new LinkedList<Integer>();
for(int i=0;i<height.length;i++)
{
while(!stack.isEmpty() && height[i]<=height[stack.peek()])
{
int index = stack.pop();
int curArea = stack.isEmpty()?i*height[index]:(i-stack.peek()-1)*height[index];
maxArea = Math.max(maxArea,curArea);
}
stack.push(i);
}
while(!stack.isEmpty())
{
int index = stack.pop();
int curArea = stack.isEmpty()?height.length*height[index]:(height.length-stack.peek()-1)*height[index];
maxArea = Math.max(maxArea,curArea);
}
return maxArea;
}
}
就是这样。每次统计每行累计1的个数,然后计算出每行的最大直方图面积。
那么代码是如下所示:
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix==null || matrix.length==0 || matrix[0].length==0)
{
return 0;
}
int maxArea = 0;
int[] height = new int[matrix[0].length];
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
{
height[j] = matrix[i][j]=='0'?0:height[j]+1;
}
maxArea = Math.max(largestRectangleArea(height),maxArea);
}
return maxArea;
}
public int largestRectangleArea(int[] height) {
if(height==null || height.length==0)
{
return 0;
}
int maxArea = 0;
LinkedList<Integer> stack = new LinkedList<Integer>();
for(int i=0;i<height.length;i++)
{
while(!stack.isEmpty() && height[i]<=height[stack.peek()])
{
int index = stack.pop();
int curArea = stack.isEmpty()?i*height[index]:(i-stack.peek()-1)*height[index];
maxArea = Math.max(maxArea,curArea);
}
stack.push(i);
}
while(!stack.isEmpty())
{
int index = stack.pop();
int curArea = stack.isEmpty()?height.length*height[index]:(height.length-stack.peek()-1)*height[index];
maxArea = Math.max(maxArea,curArea);
}
return maxArea;
}
}
相关文章推荐
- LeetCode之“动态规划”:Maximal Square && Largest Rectangle in Histogram && Maximal Rectangle
- 【LeetCode】Maximal Rectangle && Maximal Square
- leetcode Maximal Rectangle
- leetcode之Maximal Rectangle
- [leetcode]Maximal Rectangle @ Python
- LeetCode "Maximal Rectangle"
- maximal Rectangle--LeetCode
- LeetCode Maximal Rectangle
- LeetCode Maximal Rectangle
- 【leetcode】Array——Maximal Rectangle(85)
- leetcode -- Maximal Rectangle TODO O(N)
- LeetCode Maximal Rectangle
- leetcode: Maximal Rectangle
- LeetCode 85 (Maximal-Rectangle)java
- leetcode Maximal Rectangle
- LeetCode Maximal Rectangle
- LeetCode Maximal Rectangle
- Leetcode Maximal Rectangle
- Leetcode_maximal-rectangle
- 求全是1的最大矩阵面积 Maximal Rectangle @LeetCode