Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e317e87

Browse files
84.柱状图中最大的矩形增加Go解法
1 parent 8747fe1 commit e317e87

File tree

1 file changed

+122
-1
lines changed

1 file changed

+122
-1
lines changed

‎problems/0084.柱状图中最大的矩形.md‎

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,128 @@ class Solution:
474474

475475
### Go:
476476

477-
> 单调栈
477+
暴力解法
478+
479+
```go
480+
func largestRectangleArea(heights []int) int {
481+
sum := 0
482+
for i := 0; i < len(heights); i++ {
483+
left, right := i, i
484+
for left >= 0 {
485+
if heights[left] < heights[i] {
486+
break
487+
}
488+
left--
489+
}
490+
for right < len(heights) {
491+
if heights[right] < heights[i] {
492+
break
493+
}
494+
right++
495+
}
496+
w := right - left - 1
497+
h := heights[i]
498+
sum = max(sum, w * h)
499+
}
500+
return sum
501+
}
502+
503+
func max(x, y int) int {
504+
if x > y {
505+
return x
506+
}
507+
return y
508+
}
509+
```
510+
511+
双指针解法
512+
513+
```go
514+
func largestRectangleArea(heights []int) int {
515+
size := len(heights)
516+
minLeftIndex := make([]int, size)
517+
minRightIndex := make([]int, size)
518+
519+
// 记录每个柱子 左边第一个小于该柱子的下标
520+
minLeftIndex[0] = -1 // 注意这里初始化,防止下面while死循环
521+
for i := 1; i < size; i++ {
522+
t := i - 1
523+
// 这里不是用if,而是不断向左寻找的过程
524+
for t >= 0 && heights[t] >= heights[i] {
525+
t = minLeftIndex[t]
526+
}
527+
minLeftIndex[i] = t
528+
}
529+
// 记录每个柱子 右边第一个小于该柱子的下标
530+
minRightIndex[size - 1] = size; // 注意这里初始化,防止下面while死循环
531+
for i := size - 2; i >= 0; i-- {
532+
t := i + 1
533+
// 这里不是用if,而是不断向右寻找的过程
534+
for t < size && heights[t] >= heights[i] {
535+
t = minRightIndex[t]
536+
}
537+
minRightIndex[i] = t
538+
}
539+
// 求和
540+
result := 0
541+
for i := 0; i < size; i++ {
542+
sum := heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1)
543+
result = max(sum, result)
544+
}
545+
return result
546+
}
547+
548+
func max(x, y int) int {
549+
if x > y {
550+
return x
551+
}
552+
return y
553+
}
554+
```
555+
556+
单调栈
557+
558+
```go
559+
func largestRectangleArea(heights []int) int {
560+
result := 0
561+
heights = append([]int{0}, heights...) // 数组头部加入元素0
562+
heights = append(heights, 0) // 数组尾部加入元素0
563+
st := []int{0}
564+
565+
// 第一个元素已经入栈,从下标1开始
566+
for i := 1; i < len(heights); i++ {
567+
if heights[i] > heights[st[len(st)-1]] {
568+
st = append(st, i)
569+
} else if heights[i] == heights[st[len(st)-1]] {
570+
st = st[:len(st)-1]
571+
st = append(st, i)
572+
} else {
573+
for len(st) > 0 && heights[i] < heights[st[len(st)-1]] {
574+
mid := st[len(st)-1]
575+
st = st[:len(st)-1]
576+
if len(st) > 0 {
577+
left := st[len(st)-1]
578+
right := i
579+
w := right - left - 1
580+
h := heights[mid]
581+
result = max(result, w * h)
582+
}
583+
}
584+
st = append(st, i)
585+
}
586+
}
587+
return result
588+
}
589+
590+
func max(x, y int) int {
591+
if x > y {
592+
return x
593+
}
594+
return y
595+
}
596+
```
597+
598+
单调栈精简
478599

479600
```go
480601
func largestRectangleArea(heights []int) int {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /