84.柱状图中最大的矩形增加Go解法

This commit is contained in:
markwang
2024-10-28 10:15:08 +08:00
parent 8747fe1a47
commit e317e8761e

View File

@ -474,7 +474,128 @@ class Solution:
### Go:
> 单调栈
暴力解法
```go
func largestRectangleArea(heights []int) int {
sum := 0
for i := 0; i < len(heights); i++ {
left, right := i, i
for left >= 0 {
if heights[left] < heights[i] {
break
}
left--
}
for right < len(heights) {
if heights[right] < heights[i] {
break
}
right++
}
w := right - left - 1
h := heights[i]
sum = max(sum, w * h)
}
return sum
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
```
双指针解法
```go
func largestRectangleArea(heights []int) int {
size := len(heights)
minLeftIndex := make([]int, size)
minRightIndex := make([]int, size)
// 记录每个柱子 左边第一个小于该柱子的下标
minLeftIndex[0] = -1 // 注意这里初始化防止下面while死循环
for i := 1; i < size; i++ {
t := i - 1
// 这里不是用if而是不断向左寻找的过程
for t >= 0 && heights[t] >= heights[i] {
t = minLeftIndex[t]
}
minLeftIndex[i] = t
}
// 记录每个柱子 右边第一个小于该柱子的下标
minRightIndex[size - 1] = size; // 注意这里初始化防止下面while死循环
for i := size - 2; i >= 0; i-- {
t := i + 1
// 这里不是用if而是不断向右寻找的过程
for t < size && heights[t] >= heights[i] {
t = minRightIndex[t]
}
minRightIndex[i] = t
}
// 求和
result := 0
for i := 0; i < size; i++ {
sum := heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1)
result = max(sum, result)
}
return result
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
```
单调栈
```go
func largestRectangleArea(heights []int) int {
result := 0
heights = append([]int{0}, heights...) // 数组头部加入元素0
heights = append(heights, 0) // 数组尾部加入元素0
st := []int{0}
// 第一个元素已经入栈从下标1开始
for i := 1; i < len(heights); i++ {
if heights[i] > heights[st[len(st)-1]] {
st = append(st, i)
} else if heights[i] == heights[st[len(st)-1]] {
st = st[:len(st)-1]
st = append(st, i)
} else {
for len(st) > 0 && heights[i] < heights[st[len(st)-1]] {
mid := st[len(st)-1]
st = st[:len(st)-1]
if len(st) > 0 {
left := st[len(st)-1]
right := i
w := right - left - 1
h := heights[mid]
result = max(result, w * h)
}
}
st = append(st, i)
}
}
return result
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
```
单调栈精简
```go
func largestRectangleArea(heights []int) int {