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

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

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

package mainimport (    "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. 柱状图中最大的矩形
评论

©著作权归作者所有:来自51CTO博客作者福大大的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. 我的第32个代码
  2. MySQL的Bugs
  3. springboot2.x引入Mybatis-plus-generator代码自动生成工具
  4. 最近两年都跑哪去了,三句话告诉你
  5. 【asp.net core 系列】9 实战之 UnitOfWork以及自定义代码生成
  6. 我的第31个代码
  7. 我的第30个代码
  8. 经典面试题(18):以下代码将输出的结果是什么?
  9. 经典面试题(19):以下代码将输出的结果是什么?

随机推荐

  1. 用户列表的10篇内容推荐
  2. 关于OFBiz的详细介绍
  3. 有关UTF-16的问题及解决方法
  4. 关于结果保存的10篇文章推荐
  5. 布局文件如何使用?总结布局文件实例用法
  6. 关于XMLHTTP对象的详细介绍
  7. 关于xml的作用的详细介绍
  8. 通过XSLT将xml转换为html的代码示例
  9. 带你了解什么是RSS
  10. 关于XML文档类型的详细介绍