84. 柱状图中最大的矩形
柱状图中最大的矩形
题目描述:
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
思路:‘
第一种解法,暴力,这道问题的暴力解法比「接雨水」那道题要其实好想得多:可以枚举以每个柱形为高度的最大矩形的面积。
具体来说就是:依次遍历柱形的高度,对于每一个高度分别向两边扩散,求出以当前高度为矩形的最大宽度多少。(golang会超时)
第二种解法是哨兵加上单调栈,就是如果出现前一个和后一个都比这个数小,就说明这个数的最大面积已经算出来的,可以出局了
代码:
//第一种解法
func largestRectangleArea(heights []int) int {
if len(heights)==0{
return 0
}
var sum,max,i,j int
for k,v :=range heights{
for i = k-1;i>=0 && i<len(heights);i--{
if heights[i]<heights[k]{
break
}
}
for j = k+1;j>=0 && j<len(heights);j++{
if heights[j]<heights[k]{
break
}
}
sum = (j-i-1) *v
fmt.Println(sum)
if sum>max{
max = sum
}
}
return max
}
//解法二
func largestRectangleArea(heights []int) int {
if len(heights) == 0 {
return 0
}
stack := make([]int, 0, len(heights))
heights = append(heights, -1)
heights = append([]int{-1}, heights...)
var maxsize int
for i := 0; i < len(heights); i++ {
for len(stack)>0&&heights[Peek(stack)] > heights[i] {
stack, v := Pop(stack)
if sum := (i - Peek(stack) - 1) * heights[v]; sum > maxsize {
maxsize = sum
}
}
stack = append(stack, i)
}
return maxsize
}
func Pop(stack []int) ([]int, int) {
s := stack[len(stack)-1]
stack = stack[:len(stack)-1]
return stack, s
}
func Peek(stack []int) int {
return stack[len(stack)-1]
}
代码效率:
执行用时:108 ms, 在所有 Go 提交中击败了49.43%的用户
内存消耗:9.1 MB, 在所有 Go 提交中击败了30.36%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!