2019.10.14 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
github:https://github.com/ChopinXBP/LeetCode-Babel
这道题是之前做过的一道题的拓展题:LeetCode(84):柱状图中最大的矩形 Largest Rectangle in Histogram(Java)
从之前的解法思路出发可以有三种方法:
1.动态规划:宽度拓展
dp[i][j]代表以位置ij为右下角的矩形的宽,第一列矩形宽dp值初始化为1,其余列的状态转移方程为dp[i][j] = dp[i][j - 1] + 1。
遍历更新每一个dp[i][j]的同时,可以根据ij位置为右下角的矩形的宽,从下往上遍历调整宽度,计算该矩形的最大面积。
2.单调递增栈
dp[i][j]代表从上往下截至i行位置j的最大高度,对于每一行dp值,可以看成LeetCode(84)中的求柱状图中矩形最大面积的问题,对求解方法进行复用。根据dp值的计算特点还可以将其压缩至一维。
3.动态规划:按点拓展(最优)
left(right)代表每一个点向左(右)延伸的最大长度,height代表每一个点向上延伸的最大高度。按行遍历每一个ij,动态更新三个数组。每一点j对应的最大矩阵面积即为right[j] - left[j]) * height[j]。
正方形是特殊的矩形,最大正方形问题也是最大矩形问题的子问题。可以直接在方法3的基础上进行改进求得。也有特别的动态规划策略:
dp[i][j]代表以(i-1,j-1)位置为右下角的最大正方形边长,当ij位置为’1’时,ij点的最大正方形边长取决于左上侧三点的最大正方形边长,状态转移方程为:
dp[i][j] = Min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
import java.util.Arrays;
import java.util.Stack;
/**
*
* Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
* 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
*
*/
public class MaximalRectangle {
//动态规划:宽度拓展
public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length == 0){
return 0;
}
//dp[i][j]代表以位置ij为右下角的矩形的宽
int[][] dp = new int[matrix.length][matrix[0].length];
int maxArea = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == '1'){
//第一列矩形宽dp值初始化为1,其余列的状态转移方程为dp[i][j] = dp[i][j - 1] + 1;
dp[i][j] = j == 0 ? 1 : dp[i][j - 1] + 1;
//根据ij位置为右下角的矩形的宽,从下往上遍历调整宽度,可以计算该矩形的最大面积
int width = dp[i][j];
for(int k = i; k >= 0; k--){
width = Math.min(width, dp[k][j]);
if(width == 0){
break;
}
maxArea = Math.max(maxArea, width * (i - k + 1));
}
}
}
}
return maxArea;
}
//单调递增栈
public int maximalRectangle2(char[