给定一个仅包含 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
1 <= row, cols <= 200
matrix[i][j] 为 '0' 或 '1
思路,这道题可以先退化为84的形状,然后用同样的处理代码来处理
func maximalRectangle(matrix [][]byte) int {
if matrix == nil || len(matrix) == 0 {
return 0
}
//保存最终结果
max := 0
//行数,列数
m, n := len(matrix), len(matrix[0])
//高度数组(统计每一行中1的高度)
height := make([]int, n)
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
//每一行去找1的高度
//如果不是‘1’,则将当前高度置为0
if matrix[i][j] == '0' {
height[j] = 0
} else {
//是‘1’,则将高度加1
height[j] = height[j] + 1
}
}
//更新最大矩形的面积
max = int(math.Max(float64(max), float64(maxRectangle(height))))
}
return max
}
func maxRectangle(heights []int) int {
//最大矩形面积
maxarea := 0
//定义栈
stack := make([]int, 0)
//放入-1在栈底是为了:如果矩形包括索引为0处的柱子,则左边界为0的左边,方便计算左边界的索引
stack = append(stack, -1)
for i := 0; i < len(heights); i++ {
//当下一个柱子的高度小于当前栈顶柱子的高度
for stack[len(stack)-1] != -1 && heights[stack[len(stack)-1]] >= heights[i] {
//得到当前栈顶元素的索引
tmp := stack[len(stack)-1]
//出栈
stack = stack[:len(stack)-1]
//更新面积
maxarea = int(math.Max(float64(maxarea), float64(heights[tmp]*(i-stack[len(stack)-1]-1))))
}
//当新加入柱子的高度大于栈顶柱子的高度(满足升序)
stack = append(stack, i)
}
//当遍历完数组时,判断栈是否为空
for stack[len(stack)-1] != -1 {
//得到当前栈顶元素索引
tmp := stack[len(stack)-1]
//出栈
stack = stack[:len(stack)-1]
//更新面积
maxarea = int(math.Max(float64(maxarea), float64(heights[tmp]*(len(heights)-1-stack[len(stack)-1]))))
}
return maxarea
}