66 直方图最大矩形面具
力扣https://leetcode-cn.com/problems/0ynMMM/
//采用单调栈的思路,栈内数字必须单调递增
func largestRectangleArea(heights []int) int {
var res int
stack:=[]int{}
//用于解决边界问题,当只有一个长度的heights传入,不用做特殊处理
heights = append(heights,0)
//-1的目的是可以将栈内遗留的值全部排出
heights = append([]int{-1}, heights...)
for i:=0;i<len(heights);i++{
//当栈内有多于1个且当前值小于栈内末尾值需要被排出
for len(stack)>1&&heights[i]<heights[stack[len(stack)-1]]{
//由于遇到了i为比len(stack)-1小,需要排出len(stack)-1为index1
//找到其次小len(stack)-2为index2
//由于单调性则index2-index1-1这个长度都满足高度heights[stack[len(stack)-1]]
//求最大即可,之后删除栈末尾值
lastindex:=stack[len(stack)-2]
height:=heights[stack[len(stack)-1]]
res = max(res,height*(i-lastindex-1))
stack = stack[:len(stack)-1]
}
stack = append(stack,i)
}
return res
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
67 矩阵中最大的矩形
力扣https://leetcode-cn.com/problems/PLYXKQ/
func max(a, b int) int {
if a > b {
return a
}
return b
}
func getMaxArea(arr []int)int{
var res int
stack:=[]int{}
arr = append(arr,0)
arr = append([]int{-1}, arr...)
for i:=0;i<len(arr);i++{
//单调增
for len(stack)>1&&arr[i]<arr[stack[len(stack)-1]]{
lastindex:=stack[len(stack)-2]
height:=arr[stack[len(stack)-1]]
res = max(res,height*(i-lastindex-1))
stack = stack[:len(stack)-1]
}
stack = append(stack,i)
}
return res
}
func maximalRectangle(matrix []string) int {
if len(matrix)==0{
return 0
}
var max int
arr :=make([]int,len(matrix[0]))
for i:=0;i<len(matrix);i++{
for j:=0;j<len(matrix[i]);j++{
tmp,_:=strconv.Atoi(string(matrix[i][j]))
if tmp == 0{
arr[j] = 0
}else{
arr[j] = arr[j] + tmp
}
}
//一个矩形
tmp := getMaxArea(arr)
if tmp > max{
max = tmp
}
}
return max
}