034_柱状图中最大的矩形

知识点:单调栈

LeetCode第八十四题:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/

语言:GoLang

// 今日份抄作业:单调栈
func largestRectangleArea(heights []int) int {
    // 末尾加个哨兵元素
	heights = append(heights, 0)

    length := len(heights)

    maxArea := 0
    stack := make([]int, 0)
    for i := 0; i < length; i++ {
        for len(stack) > 0 && heights[i] < heights[stack[len(stack) - 1]]{
            tmp := stack[len(stack) - 1]
            stack = stack[:len(stack) - 1]

            pre := -1
            if len(stack) > 0 {
                pre = stack[len(stack) - 1]
            }

            maxArea = max(maxArea, (i - pre - 1) * heights[tmp])
            
        }
        stack = append(stack, i)
    }

    return maxArea
}



// 朴素暴力二,O(n^2),勉强及格
func largestRectangleArea__(heights []int) int {
    maxArea := 0
    length := len(heights)

    for i := 0; i < length; i++ {
        min := math.MaxInt32
        for j := i; j < length; j++ {
            if heights[j] < min {
                min = heights[j]
            }
            maxArea = max((j - i + 1) * min, maxArea)
        }
    }

    return maxArea
}


// 朴素暴力,O(n^3),超时
func largestRectangleArea_(heights []int) int {
    maxArea := 0
    length := len(heights)

    for i := 0; i < length; i++ {
        for j := i; j < length; j++ {
            min := math.MaxInt32
            for k := i; k <= j; k++ {
                if heights[k] < min {
                    min = heights[k]
                }
            }
            maxArea = max((j - i + 1) * min, maxArea)
        }
    }

    return maxArea
}

func max(a int, b int) int {
    if a > b {
        return a
    }
    return b
}
posted @ 2020-03-23 20:04  Cenyol  阅读(97)  评论(0)    收藏  举报