題面
給出n個數字,代表直方圖的條高,直方圖每一條的寬度為1,請計算直方圖中最大矩形的面積
上圖是每條寬度為1, 高度 =[2,1,5,6,2,3].的直方圖
圖中的陰影部分是該直方圖中面積最大的矩形,面積為10個單位
輸入
[2,1,5,6,2,3]
返回
10
暴力雙指標
- 雙指標滑動視窗確定矩形長
- 以當前高程為基準左右邊界水平擴充套件
- 遍歷小於基準停止擴充套件,計算矩形圖面積,留大值
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 協議》,轉載必須註明作者和本文連結