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题思路相同,区别是这得一行一行遍历,算出这一行的最大矩阵,最后得出最大矩阵
代码:
func maximalRectangle(matrix [][]byte) int {
var levelheight []int
var max int
num := 0
for i:=0;i<len(matrix);i++{
for j:=0;j<len(matrix[0]);j++{
for k:=i;k>=0;k--{
if matrix[k][j]=='1'{
num++
}else{
break
}
}
levelheight = append(levelheight,num)
num = 0
}
//fmt.Println(levelheight)
linemax :=largestRectangleArea(levelheight)
levelheight = levelheight[:0]
if max < linemax{
max = linemax
}
}
return max
}
func largestRectangleArea(heights []int) int {
if len(heights) == 0 {
return 0
}
stack := make([]int, 0, len(heights))
heights = append(heights, -1)
heights = append([]int{-1}, heights...)
var maxsize int
for i := 0; i < len(heights); i++ {
for len(stack)>0&&heights[Peek(stack)] > heights[i] {
s, v := Pop(stack)
stack = s
if sum := (i - Peek(stack) - 1) * heights[v]; sum > maxsize {
maxsize = sum
}
}
stack = append(stack, i)
}
return maxsize
}
func Pop(stack []int) ([]int, int) {
s := stack[len(stack)-1]
stack = stack[:len(stack)-1]
return stack, s
}
func Peek(stack []int) int {
return stack[len(stack)-1]
}
代码效率:
执行用时:4 ms, 在所有 Go 提交中击败了86.94%的用户
内存消耗:4.9 MB, 在所有 Go 提交中击败了35.08%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!