直方圖中最大矩形

pardon110發表於2020-10-15

題面

給出n個數字,代表直方圖的條高,直方圖每一條的寬度為1,請計算直方圖中最大矩形的面積

直方圖中最大矩形
上圖是每條寬度為1, 高度 =[2,1,5,6,2,3].的直方圖
圖中的陰影部分是該直方圖中面積最大的矩形,面積為10個單位
輸入

[2,1,5,6,2,3]

返回

10

暴力雙指標

  1. 雙指標滑動視窗確定矩形長
  2. 以當前高程為基準左右邊界水平擴充套件
  3. 遍歷小於基準停止擴充套件,計算矩形圖面積,留大值
    func largestRectangleArea( height []int ) int {
        var max int
        for i:=0;i<len(height);i++{
            if height[i] !=0 {
                left,right := i,i
                for right < len(height)-1 && height[right+1] >= height[i]{
                    right++
                }
                for left > 0 && height[left-1] >= height[i] {
                    left--
                }
                if cur := height[i] *(right - left + 1);cur > max {
                    max = cur
                }
            }
        }
        return max
    }

單調棧

  • 較小的元素會成為矩形高的限制條件
  • 構建單調棧,所有的單調遞增留至最後計算
  • 在陣列最後新增了一個0,保證遍歷最後一個元素時棧被清空,及計算的越界需求
  • 棧底元素出棧後,當前索引長視為矩形長
    func largestRectangleArea( height []int ) int {
          var max int
          height = append(height, 0)  //簡化程式碼,確保棧被清空
          for st,i:=[]int{},0;i<len(height);i++{
              for len(st)>0 && height[st[len(st)-1]] > height[i]{
                  h:=height[st[len(st)-1]]
                  st = st[:len(st)-1]
                  leftIdx:=-1
                  if len(st)>0{
                      leftIdx = st[len(st)-1]
                  }
                  if cur := h*(i- leftIdx -1); cur > max {
                      max = cur
                  }
              }
              st = append(st, i)
          }
          return max
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章