柱状图中最大的矩形
定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。
1. 暴力求解
// func largestRectangleArea(heights []int) int {
// maxArea := 0
// for i := 0 ; i < len(heights) ; i ++ {
// minHeight := heights[i]
// for j := i ; j < len(heights); j ++ {
// minHeight = min(minHeight, heights[j])
// maxArea = max(maxArea, minHeight*(j-i+1))
// }
// }
// return maxArea
// }
func max(a, b int) int {
if a >= b {
return a
}
return b
}
func min(a, b int) int {
if a <= b {
return a
}
return b
}
type Element struct {
value int
index int
}
type stackType struct {
Array []Element
}
func (st *stackType) peek() Element {
if len(st.Array) == 0 {
return Element{}
}
return st.Array[len(st.Array)-1]
}
func (st *stackType) pop() {
if len(st.Array) == 0 {
return
}
st.Array = st.Array[:len(st.Array)-1]
}
func (st *stackType) push(ele Element) {
st.Array = append(st.Array, ele)
}
func (st *stackType) size() int {
return len(st.Array)
}
func newStack() *stackType {
stack := &stackType{
Array: make([]Element, 0),
}
initElement := Element{
index: -1,
value: -1,
}
stack.push(initElement)
return stack
}
/*
1. 入栈检查
2. 清空队列
3. i 为右边界
*/
func largestRectangleArea(heights []int) int {
stack := newStack()
maxArea := 0
for i := 0; i < len(heights)+1; i++ {
for {
top := stack.peek()
if i < len(heights) && top.value <= heights[i] {
newElement := Element{
index: i,
value: heights[i],
}
stack.push(newElement)
break
}
if stack.size() == 1 {
break
}
stack.pop()
left := stack.peek()
area := top.value * (i - left.index - 1)
maxArea = max(maxArea, area)
}
}
return maxArea
}Last updated
Was this helpful?