MT4 直方图内最大矩形

直方图内最大矩形

题目描述:

给定一个数组heights,长度为n,height[i]是在第i点的高度,那么height[i]表示的直方图,能够形成的最大矩形是多少?

1.每个直方图宽度都为1

2.直方图都是相邻的

3.如果不能形成矩形,返回0即可

4.保证返回的结果不会超过231-1

数据范围:

0 <= heights[i] <= 10^40<=heights[i]<=104

0 <= heights.length <=10^50<=heights.lengt**h<=105

如输入[3,4,7,8,1,2],那么如下:

img

示例1

输入:

[3,4,7,8,1,2]

复制

返回值:

14

复制

示例2

输入:

[1,7,3,2,4,5,8,2,7]

返回值:

16

思路:

时间复杂度:O(n),空间复杂度:O(n)

单调栈思路做,如果一个数比之前的大就入栈,确保栈里面的数据是有序的,然后遇到比自己小的就出栈直到栈有序,这里有个技巧是加入哨兵就可以简化判断边界情况的复杂度。

代码:

package main

func largestRectangleArea( heights []int ) int {
    
    var  stack []int
    if heights == nil{
        return 0
    }
    // 插入一个数防止栈空
    stack = append(stack, 0)
    heights = append([]int{-1}, heights...)
    maxNum := heights[1]
    heights = append(heights, -1)
    n := len(heights)
    secondTop := 0
    for i:=1;i<n;i++{
        top := stack[len(stack)-1]
        if len(stack )>1{
            secondTop = stack[len(stack)-2]
        }else{
            secondTop = top
        }
            for heights[top]>heights[i]{
                maxNum = max((i - secondTop-1) * heights[top], maxNum)
                stack = stack[:len(stack)-1]
                top = stack[len(stack)-1]
                if len(stack)>1{
                    secondTop = stack[len(stack)-2]
                }else{
                    secondTop = top
                }
            }
        stack = append(stack, i)
    }
    return maxNum
}

func max(a ,b int)int{
    if a>b{
        return a
    }
    return b
}

代码效率:

运行时间:35ms超过56.52% 用Go提交的代码
占用内存:10292KB超过39.13%用Go提交的代码


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!