描述
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路
84题链接地址
利用84题, 求最大矩形的思想 对每一行求出柱形图的高度
实现
func maximalRectangle(matrix [][]byte) int {
var max int
rows := len(matrix)
if rows == 0{
return max
}
cols := len(matrix[0])
nums := make([]int, cols)
for row := 0; row < rows; row++{
for col := 0; col < cols; col++{
if matrix[row][col] != '0'{
nums[col] = nums[col] + 1
}else{
nums[col] = 0
}
}
maxArea := largestRectangleArea(nums)
max = Max(max, maxArea)
}
return max
}
func largestRectangleArea(heights []int) int {
var max int
var stack = make([]int, 0)
var nums = make([]int, 0)
nums = append(nums, []int{0}...)
nums = append(nums, heights...)
nums = append(nums, []int{0}...)
for i := 0; i < len(nums); i++{
for len(stack) > 0 && nums[stack[len(stack)-1]] > nums[i]{
tmp := stack[len(stack)-1]
stack = stack[0: len(stack)-1]
max = Max(max, nums[tmp]*(i-stack[len(stack)-1]-1))
}
stack = append(stack, i)
}
return max
}
func Max(a, b int) int {
if a >= b {
return a
} else {
return b
}
}