?LeetCode刷題實戰(zhàn)84: 柱狀圖中最大的矩形
算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !
今天和大家聊的問題叫做?柱狀圖中最大的矩形,我們先來看題面:
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
題意

輸入: [2,1,5,6,2,3]
輸出: 10
解題
區(qū)間求最值

,大概是n的平方量級個區(qū)間。對于每個區(qū)間,我們需要遍歷它們中的元素獲取最小值,這需要
的遍歷時間,所以整體的復(fù)雜度應(yīng)該在
量級。顯然這是一個非常大的數(shù)量級,當(dāng)n超過1000就很難計算出解了。
,但即便如此最終的復(fù)雜度也很高。這是因為我們遍歷區(qū)間首尾位置就耗費了
,而這是很難優(yōu)化的。所以這個思路的極限已經(jīng)確定了,我們無法做出大的優(yōu)化。逆向思維

的復(fù)雜度,然而我們尋找短板,只需要
,也就是說這種思路的搜索空間更小,只要我們保證搜索的效率,就可以更快地找到答案。class Solution:
????def largestRectangleArea(self, heights:?List[int]) -> int:
????????n = len(heights)
??# 左側(cè)邊界初始化為0
????????left_side = [0?for?i in range(n)]
????????# 右側(cè)邊界初始化為n-1
????????right_side = [n-1?for?_ in range(n)]
????????
????????stack_left = []
????????stack_right = []
????????
????????for?i in range(n):
????????????h = heights[i]
????????????# 彈出棧中所有比當(dāng)前元素小的值
????????????# 注意,棧內(nèi)存儲的是下標(biāo)
????????????while?len(stack_right) > 0?and?h < heights[stack_right[-1]]:
????????????????tail = stack_right[-1]
????????????????stack_right.pop()
????????????????right_side[tail] = i - 1
????????????
????????????# 當(dāng)前元素入棧
????????????stack_right.append(i)
????????????
????????????# 把坐標(biāo)翻轉(zhuǎn),等價于逆向遍歷
????????????i_ = n - 1?- i
????????????h = heights[i_]
????????????
????????????# 維護(hù)單調(diào)棧的邏輯同上
????????????while?len(stack_left) > 0?and?h < heights[stack_left[-1]]:
????????????????tail = stack_left[-1]
????????????????stack_left.pop()
????????????????left_side[tail] = i_ + 1
????????????????
????????????# 當(dāng)前元素入棧
????????????stack_left.append(i_)
????????????????
????????ret?= 0
????????for?i in range(n):
????????????# 矩形面積等于右側(cè)邊界-左側(cè)邊界+1?x?高度
????????????cur = (right_side[i] - left_side[i] + 1) * heights[i]
????????????ret?= max(ret, cur)
????????return?ret
總結(jié)
上期推文:
