Skip to content

Commit 259eba0

Browse files
authored
Merge pull request halfrost#148 from novahe/fix/84
fix/84: easier to understand code
2 parents dbdc464 + aa89126 commit 259eba0

File tree

3 files changed

+46
-48
lines changed

3 files changed

+46
-48
lines changed

leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram.go

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,25 @@
11
package leetcode
22

3-
import "fmt"
4-
53
func largestRectangleArea(heights []int) int {
6-
maxArea, stack, height := 0, []int{}, 0
7-
for i := 0; i <= len(heights); i++ {
8-
if i == len(heights) {
9-
height = 0
10-
} else {
11-
height = heights[i]
4+
maxArea := 0
5+
n := len(heights) + 2
6+
// Add a sentry at the beginning and the end
7+
getHeight := func(i int) int {
8+
if i == 0 || n-1 == i {
9+
return 0
1210
}
13-
if len(stack) == 0 || height >= heights[stack[len(stack)-1]] {
14-
stack = append(stack, i)
15-
} else {
16-
tmp := stack[len(stack)-1]
17-
fmt.Printf("1. tmp = %v stack = %v\n", tmp, stack)
18-
stack = stack[:len(stack)-1]
19-
length := 0
20-
if len(stack) == 0 {
21-
length = i
22-
} else {
23-
length = i - 1 - stack[len(stack)-1]
24-
fmt.Printf("2. length = %v stack = %v i = %v\n", length, stack, i)
25-
}
26-
maxArea = max(maxArea, heights[tmp]*length)
27-
fmt.Printf("3. maxArea = %v heights[tmp]*length = %v\n", maxArea, heights[tmp]*length)
28-
i--
11+
return heights[i-1]
12+
}
13+
st := make([]int, 0, n/2)
14+
for i := 0; i < n; i++ {
15+
for len(st) > 0 && getHeight(st[len(st)-1]) > getHeight(i) {
16+
// pop stack
17+
idx := st[len(st)-1]
18+
st = st[:len(st)-1]
19+
maxArea = max(maxArea, getHeight(idx)*(i-st[len(st)-1]-1))
2920
}
21+
// push stack
22+
st = append(st, i)
3023
}
3124
return maxArea
3225
}

leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ func Test_Problem84(t *testing.T) {
4040
para84{[]int{1, 1}},
4141
ans84{2},
4242
},
43+
{
44+
para84{[]int{2, 1, 2}},
45+
ans84{3},
46+
},
4347
}
4448

4549
fmt.Printf("------------------------Leetcode Problem 84------------------------\n")

website/content/ChapterFour/0001~0099/0084.Largest-Rectangle-in-Histogram.md

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,37 +41,38 @@ Output: 10
4141

4242
package leetcode
4343

44-
import "fmt"
45-
4644
func largestRectangleArea(heights []int) int {
47-
maxArea, stack, height := 0, []int{}, 0
48-
for i := 0; i <= len(heights); i++ {
49-
if i == len(heights) {
50-
height = 0
51-
} else {
52-
height = heights[i]
45+
maxArea := 0
46+
n := len(heights) + 2
47+
// Add a sentry at the beginning and the end
48+
getHeight := func(i int) int {
49+
if i == 0 || n-1 == i {
50+
return 0
5351
}
54-
if len(stack) == 0 || height >= heights[stack[len(stack)-1]] {
55-
stack = append(stack, i)
56-
} else {
57-
tmp := stack[len(stack)-1]
58-
fmt.Printf("1. tmp = %v stack = %v\n", tmp, stack)
59-
stack = stack[:len(stack)-1]
60-
length := 0
61-
if len(stack) == 0 {
62-
length = i
63-
} else {
64-
length = i - 1 - stack[len(stack)-1]
65-
fmt.Printf("2. length = %v stack = %v i = %v\n", length, stack, i)
66-
}
67-
maxArea = max(maxArea, heights[tmp]*length)
68-
fmt.Printf("3. maxArea = %v heights[tmp]*length = %v\n", maxArea, heights[tmp]*length)
69-
i--
52+
return heights[i-1]
53+
}
54+
st := make([]int, 0, n/2)
55+
for i := 0; i < n; i++ {
56+
for len(st) > 0 && getHeight(st[len(st)-1]) > getHeight(i) {
57+
// pop stack
58+
idx := st[len(st)-1]
59+
st = st[:len(st)-1]
60+
maxArea = max(maxArea, getHeight(idx)*(i-st[len(st)-1]-1))
7061
}
62+
// push stack
63+
st = append(st, i)
7164
}
7265
return maxArea
7366
}
7467

68+
func max(a int, b int) int {
69+
if a > b {
70+
return a
71+
}
72+
return b
73+
}
74+
75+
7576
```
7677

7778

0 commit comments

Comments
 (0)