034_柱状图中最大的矩形
知识点:单调栈
LeetCode第八十四题:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/
语言:GoLang
// 今日份抄作业:单调栈
func largestRectangleArea(heights []int) int {
// 末尾加个哨兵元素
heights = append(heights, 0)
length := len(heights)
maxArea := 0
stack := make([]int, 0)
for i := 0; i < length; i++ {
for len(stack) > 0 && heights[i] < heights[stack[len(stack) - 1]]{
tmp := stack[len(stack) - 1]
stack = stack[:len(stack) - 1]
pre := -1
if len(stack) > 0 {
pre = stack[len(stack) - 1]
}
maxArea = max(maxArea, (i - pre - 1) * heights[tmp])
}
stack = append(stack, i)
}
return maxArea
}
// 朴素暴力二,O(n^2),勉强及格
func largestRectangleArea__(heights []int) int {
maxArea := 0
length := len(heights)
for i := 0; i < length; i++ {
min := math.MaxInt32
for j := i; j < length; j++ {
if heights[j] < min {
min = heights[j]
}
maxArea = max((j - i + 1) * min, maxArea)
}
}
return maxArea
}
// 朴素暴力,O(n^3),超时
func largestRectangleArea_(heights []int) int {
maxArea := 0
length := len(heights)
for i := 0; i < length; i++ {
for j := i; j < length; j++ {
min := math.MaxInt32
for k := i; k <= j; k++ {
if heights[k] < min {
min = heights[k]
}
}
maxArea = max((j - i + 1) * min, maxArea)
}
}
return maxArea
}
func max(a int, b int) int {
if a > b {
return a
}
return b
}

浙公网安备 33010602011771号