現有 N 個寬度為 1 單位的長條圖 (例如下圖所示),試求此長條圖中可以形成的最大矩形面積。
範例測資
範例輸入 | 範例輸出 |
---|---|
一筆測資,第一行輸入整數 N,接下來有 N 行,每行 1 個數字 H,依序代表每個長條圖的高度。(1 <= N、H <= 10000) | 輸出最大矩形面積 |
12 2 3 4 8 5 2 4 3 3 4 5 1 | 22 |
解題思路
使用 Map 來紀錄有出現的高度,然後跑一個 for (auto it:Map) 來判斷每一種高度的最大矩形面積,裡面再跑一個 For迴圈 從 0 到 N-1,並且在迴圈外設置一個變數 count 預設為 0,如果有中斷的情況,則要將 count 歸零,在歸零之前要計算 count*目前判斷的高度並判斷最大值。
範例程式碼-ZeroJudge C907: 尋找最大矩形
#include <iostream>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N, num[20000] = {}, ans = -999;
cin >> N;
map<int, int>MAP;
for (int i = 0; i<N; i++) {
cin >> num[i];
MAP[num[i]]++;
}
for (auto it:MAP) {
const int height = it.first;
int count = 0;
for (int i = 0; i<N; i++) {
if (num[i] < height) {
ans = max(ans, count*height);
count = 0;
continue;
}
count++;
}
ans = max(ans, count*height);
}
cout << ans << "\n";
}
//ZeroJudge C907
//Dr. SeanXD