mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
84.柱状图中最大的矩形增加Go解法
This commit is contained in:
@ -474,7 +474,128 @@ class Solution:
|
|||||||
|
|
||||||
### Go:
|
### 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
|
```go
|
||||||
func largestRectangleArea(heights []int) int {
|
func largestRectangleArea(heights []int) int {
|
||||||
|
Reference in New Issue
Block a user