-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path84.柱状图中最大的矩形.go
92 lines (88 loc) · 1.82 KB
/
84.柱状图中最大的矩形.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
* @lc app=leetcode.cn id=84 lang=golang
*
* [84] 柱状图中最大的矩形
*/
/**
* 1. 两层循环暴力求解。
* 确定范围找最小高度,找最小高度为O(1)。
* 时间复杂度 O(n^2)。
*/
func largestRectangleArea_1(heights []int) int {
size := len(heights)
if size == 0 {
return 0
}
ans := 0
for i := 0; i < size; i++ {
minHeight := heights[i]
for j := i; j < size; j++ {
if heights[j] < minHeight {
minHeight = heights[j]
}
if (j-i+1)*minHeight > ans {
ans = minHeight * (j - i + 1)
}
}
}
return ans
}
/**
* 2. 两层循环暴力求解。
* 第一层循环确定高度,第二层循环找左右边界。
* 时间复杂度 O(n^2)。
*/
func largestRectangleArea_2(heights []int) int {
size := len(heights)
if size == 0 {
return 0
}
ans := 0
for mid := 0; mid < size; mid++ {
left, right := mid, mid
for left > -1 && heights[left] >= heights[mid] {
left--
}
for right < size && heights[right] >= heights[mid] {
right++
}
area := (right - left - 1) * heights[mid]
if ans < area {
ans = area
}
}
return ans
}
// @lc code=start
func calcArea(heights []int, i, left, right int) int {
return heights[i] * (right - left - 1)
}
func largestRectangleArea(heights []int) int {
size := len(heights)
if size == 0 {
return 0
}
ans := 0
stack := []int{-1}
for i := 0; i < size; i++ {
for len(stack) > 1 && heights[i] < heights[stack[len(stack)-1]] {
index := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
area := calcArea(heights, index, stack[len(stack)-1], i)
if ans < area {
ans = area
}
}
stack = append(stack, i)
}
for len(stack) > 1 {
index := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
area := calcArea(heights, index, stack[len(stack)-1], size)
if ans < area {
ans = area
}
}
return ans
}
// @lc