Largest Rectangle In Histogram

题目描述

柱状图中最大的矩形

给定n个非负整数,用来表示柱状图中各个柱子的高度,每个柱子彼此相邻,且宽度为1。

示例:

输入:[2, 1, 5, 6, 2, 3]
输出:10

解法

解法一:二次循环暴力求解(一)

循环遍历数组每个元素,计算以该元素为左边界的所有面积。

  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

解法二:二次循环暴力求解(二)

循环遍历每个元素,并且查找该元素对应的左右边界,从而求出面积。

  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

func largestRectangleArea(heights []int) int {
    max := 0
    for i, v := range heights {
        left := i
        for left >= 0 && heights[left] >= v {
            left--
        }
        right := i
        for right < len(heights) && heights[right] >= v {
            right++
        }

        area := (right - left - 1) * v
        if area > max {
            max = area
        }
    }
    return max
}

解法三:单调栈+一次循环遍历

主要的算法思想为:

使用辅助栈,栈中存储的是数组下标,下标对应的数组元素是递增的。

如果当前元素小于栈顶元素,则当前元素为栈顶元素的右边界,栈中下一个元素为栈顶元素的左边界。

如果当前元素大于等于栈顶元素,则栈顶元素未找到右边界,将当前元素入栈。

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

func largestRectangleArea(heights []int) int {
    // 首尾添加0
    nums := make([]int, len(heights)+2)
    for i, v := range heights {
        nums[i+1] = v
    }

    max := 0
    stack := []int{}
    for right := range nums {
        stackLen := len(stack)
        for len(stack) > 0 && nums[stack[stackLen - 1]] > nums[right] {
            h := nums[stack[stackLen - 1]]
            stack = stack[:stackLen-1]

            stackLen = len(stack)
            left := stack[stackLen-1]
            area := (right - left - 1) * h
            if area > max {
                max = area
            }
        }
        stack = append(stack, right)
    }
    return max
}

Last updated

Was this helpful?