zoukankan      html  css  js  c++  java
  • leetcode刷题笔记八十四题 柱状图中最大的矩形

    leetcode刷题笔记八十四题 柱状图中最大的矩形

    源地址:84. 柱状图中最大的矩形

    问题描述:

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

    求在该柱状图中,能够勾勒出来的矩形的最大面积。

    以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

    图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

    示例:

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

    /**
    本题参考了Leetcode官方题解的方法,使用了哨兵单调栈处理方法
    未使用哨兵的单调栈需要注意以下几种情况:
    1.遍历完成后栈内仍有元素 栈顶元素非末尾元素
    由栈为单调栈,末尾元素未加入栈说明末尾元素比栈顶元素高
    此时先退栈,若此时栈内仍有元素, width = len - stack.pop - 1
    否则 width = len
    2.栈顶弹出后其高度值与新栈顶高度一致
    这种情况可以采用直接弹出栈顶,不处理也可以,由于计算max值,在新栈顶计算时会进行纠正。
    
    使用哨兵解法的好处:
    由于题目中提到非负整数,将原数组首尾两端插入0作为哨兵。这样就可以排除之前提到的遍历完后栈内仍有需要计算高度值的元素,同时忽略2问题能够大幅减少讨论特例。
    */
    import scala.collection.mutable.Stack
    object Solution {
        def largestRectangleArea(heights: Array[Int]): Int = {
            val newHeights = Array(0).concat(heights.concat(Array(0)))
            val stack = new Stack[Int]()
            var area = 0
            stack.push(0)
    
            for(i <- 1 to newHeights.length-1){
                while(newHeights(stack.top) > newHeights(i)){
                    val height = newHeights(stack.pop)
                    val width = i - stack.top - 1
                    area = Math.max(area, height*width)
                }
                stack.push(i)
            }
            return area
        }
    }
    
  • 相关阅读:
    中国石油大学天梯赛真题模拟第三场
    中国石油大学天梯赛真题模拟第一场
    PTA 水果忍者
    演练3-1:留言管理系统的制作
    知识点4-1:哪些应该放在动作方法中?
    Week5(10月11日):国庆后补课的复杂心情
    知识点3-5:使用强类型模板
    Week5(10月10日):国庆之后,让我们整装期待元旦吧
    知识点3-6:HTML辅助方法
    知识点3-4:给视图传递数据
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13384830.html
Copyright © 2011-2022 走看看