week5 作業A 最大矩形

2021-10-04 04:28:47 字數 1459 閱讀 2824

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2, 1, 4, 5, 1, 3, 3, 他們的寬都是1,其中最大的矩形是陰影部分。

input

輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 <= n <= 100000. 然後接下來n個整數h1, …, hn, 滿足 0 <= hi <= 1000000000. 這些數字表示直方圖中從左到右每個小矩形的高度,每個小矩形的寬度為1。 測試資料以0結尾。

output

對於每組測試資料輸出一行乙個整數表示答案。

smple input

7 2 1 4 5 1 3 3

4 1000 1000 1000 1000

0

sample output

8

4000

我的思路:這道題要運用單調棧的方法,將比棧頂元素大的數(即矩形的高度)壓入棧,當遇到比棧頂元素小的數時,將不斷取出棧頂元素,並計算寬度(當將棧頂元素提取出來後,棧空,則寬度為當前索引;否則,寬度為當前索引減一再減去此時棧頂元素的索引),從而得到以取出的元素為高的矩形的面積,直到棧頂元素小於要這個數,再把這個數壓入棧中。如果,最後棧內非空,還需要將棧內的元素逐個提取出來,計算寬度(當將棧頂元素提取出來後,棧空,則寬度為總寬度;否則,寬度為總寬度減一再減去此時棧頂元素的索引),從而得到面積。最後,找到最大的矩形面積即可。

我的總結:

單調棧的使用,可以明顯地降低時間複雜度,是乙個十分值得使用的方法。

我的**:

#include

#include

#include

using

namespace std;

long

long n,temp,width;

long

long ans;

stack<

int> st;

long

long num[

1000000];

long

long

dst()}

while

(!st.

empty()

)return ans;

}int

main()

return0;

}

week5作業題 A 最大矩形

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。input 輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 ...

A 最大矩形單調棧解法 Week5作業)

1 是一道經典的單調棧問題 2 利用單調棧計算出當前高度的矩形左右兩邊可以延伸到的寬度 計算出當前矩形左邊第乙個比該矩形高度小的座標 計算出當前矩形右邊第乙個比該矩形高度小的座標 兩者之差,是以當前矩形高度為高的最大矩形的寬度 計算矩形面積,求出最大面積 3 利用乙個單調棧從左往右對矩形高度進行遍歷...

WEEK5 周記 作業 單調棧 最大矩形

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi 1...