zoukankan      html  css  js  c++  java
  • 2020-03-01:给定一个非负数组arr,代表直方图。返回直方图的最大长方形面积。

    2020-03-01:给定一个非负数组arr,代表直方图。返回直方图的最大长方形面积。
    福哥答案2020-03-01:

    单调栈,大压小。有代码。

    代码用golang编写,代码如下:

    package main
    
    import (
        "container/list"
        "fmt"
    )
    
    func main() {
        arr := []int{3, 2, 4, 2, 5}
        fmt.Println(largestRectangleArea1(arr))
        fmt.Println(largestRectangleArea2(arr))
    }
    func largestRectangleArea1(height []int) int {
        if len(height) == 0 {
            return 0
        }
        maxArea := 0
        stack := list.New().Init()
        N := len(height)
        for i := 0; i < N; i++ {
            for !(stack.Len() == 0) && height[i] <= height[stack.Back().Value.(int)] {
                j := stack.Back().Value.(int)
                stack.Remove(stack.Back())
                k := 0
                if stack.Len() == 0 {
                    k = -1
                } else {
                    k = stack.Back().Value.(int)
                }
                curArea := (i - k - 1) * height[j]
                maxArea = getMax(maxArea, curArea)
            }
            stack.PushBack(i)
        }
        for !(stack.Len() == 0) {
            j := stack.Back().Value.(int)
            stack.Remove(stack.Back())
            k := 0
            if stack.Len() == 0 {
                k = -1
            } else {
                k = stack.Back().Value.(int)
            }
            curArea := (N - k - 1) * height[j]
            maxArea = getMax(maxArea, curArea)
        }
        return maxArea
    }
    func largestRectangleArea2(height []int) int {
        if len(height) == 0 {
            return 0
        }
        N := len(height)
        stack := make([]int, N)
        si := -1
        maxArea := 0
        for i := 0; i < N; i++ {
            for si != -1 && height[i] <= height[stack[si]] {
                j := stack[si]
                si--
                k := 0
                if si == -1 {
                    k = -1
                } else {
                    k = stack[si]
                }
                curArea := (i - k - 1) * height[j]
                maxArea = getMax(maxArea, curArea)
            }
            si++
            stack[si] = i
        }
        for si != -1 {
            j := stack[si]
            si--
            k := 0
            if si == -1 {
                k = -1
            } else {
                k = stack[si]
            }
            curArea := (N - k - 1) * height[j]
            maxArea = getMax(maxArea, curArea)
        }
        return maxArea
    }
    func getMax(a int, b int) int {
        if a > b {
            return a
        } else {
            return b
        }
    }
    

    执行结果如下:
    在这里插入图片描述


    左神java代码
    力扣84. 柱状图中最大的矩形
    评论

  • 相关阅读:
    权限设计
    ts infer关键字
    Array初始化 以及 Array.prototype.map()的一些问题
    同步、异步、事件循环
    Spring学习笔记(一)
    【面试】关于get和post两种方法的不同。
    【算法】背包问题
    当你在浏览器输入一个网址(如http://www.taobao.com),按回车之后发生了什么?
    数据库语句复习笔记
    【算法】雀魂启动(笔试题)
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14466541.html
Copyright © 2011-2022 走看看