最大矩形面積(單調棧解法,我在此題探索到了許多)

2021-09-02 19:21:52 字數 1461 閱讀 8118

目錄

》題目《

》思路《

》**《

在x軸上水平放置著 n 個條形圖,這 n 個條形圖就組成了乙個柱狀圖,每個條形圖都是乙個矩形,每個矩形都有相同的寬度,均為1單位長度,但是它們的高度並不相同。例如下圖,圖1包含的矩形的高分別為2,1,4,5,1,3,3 單位長度,矩形的寬為1單位長度。

你的任務就是計算柱狀圖中以x軸為底邊的最大矩形的面積。圖2陰影部分就是上述例子的最大矩形面積

輸入資料的第一行是乙個整數 n(1≤ n ≤100000),表示柱狀圖包含 n 個矩形。緊接著 n 個整數h1,...,hn(0≤ hi ≤20000, 1≤ i≤ n),表示柱狀圖中按從左到右順序給出的矩形的高度。矩形的寬度為1。

最大矩形的面積

72 1 4 5 1 3 3

大多數讀者一眼就看出了這是最大矩形,怎麼搞?怎麼搞?

首先,我們思考一下每個矩形是如何來的

是不是以每棟建築的高度為矩形的一邊,再尋找另一邊的長度(是的)

如何尋找另一邊呢?

是不是左邊第乙個比這個建築低的位置(左邊界)到右邊第乙個比這個建築低的位置 (右邊界)之間的距離(翻回去看,是不是?)

如何搞?

單調佇列就很有用了。

首先,如果這個元素要入隊(必須進去,別問我為什麼),就要維護此佇列的單調性(從棧底到棧頂(非)遞增(減))

這道題就要用遞增序列了(為什麼後面會講)

怎麼求左邊界呢?

試想:h[i-1] > h[i],是不是以 h[i-1] 為一邊的矩形的右邊界已經確定(因為已經不可能再往右延伸了嘛)

那麼以 h[i] 為一邊的矩形的左邊界就要向左移一位(即 h[i] 的右邊界更新成 i-1)

而這時 h[i-1] 已經已經沒用了,所以我們就可以計算以 h[i-1] 為一邊的矩形的面積,而它的右邊界是不是就是 h[i] 的位置?

以它為一邊的矩形的面積是不是就是 (h[i]的位置 - h[i-1]的位置)*h[i]。

所以,每當後乙個建築的高度小於前乙個的高度時,就要把前乙個建築彈出去,更新位置(是不是單調遞增的?)

至於細節嘛,自己想(cuo)去吧

#include #include #include using namespace std;

struct nodea[100005], b;

stackt;

int ans, n;

int main()

t.push(a[1]);

for(int i = 2; i <= n; i ++)

t.push(a[i]);

}while( !t.empty() )

printf("%d\n",ans);

return 0;

}

歡迎讀者補充與

語音計算矩形面積 兩道最大矩形的單調棧解法

leetcode 84.柱狀圖中最大的矩形 題目描述 給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 2,1,5,6,2,3 圖中陰影部分為所能勾勒出的最大...

POJ2104 最大矩形面積 單調棧

題目是英文的 這裡簡單描述一下,就是給你n個寬度1的矩形,然後連在一排,求新組成的圖形中的最大矩形.單調棧維護乙個高度單調遞增的棧,每個新數經來的時候要是比棧頂元素小的話就彈出棧頂元素直到不能再彈為止.過程中更新答案。最後清棧更新答案.include include define dnt long ...

單調棧2 矩形最大面積

如果當前行 j 位仍然是1,那麼height j 否則height j 更新為0 有乙個 n m 的棋盤,棋盤上的每個點都是紅的或綠的。你需要找出乙個面積最大的矩形區域,使得其中沒有綠的格仔。第一行 2 個正整數 n,m,描述棋盤尺寸。接下來 n 行描述這個棋盤,每行 m 個字元,每個字元為 或 x...