最大面積問題 LargestReactangle

2021-07-24 00:10:34 字數 2436 閱讀 9888

描述:在下列非負陣列中找出最大面積

heigh=[0,2,1,3,4,3,2,0]

若干非負陣列組成面積不同的矩形,求上述中的最大面積。在圖中畫出了下標[3-5]高度為3,面積為9的矩形和下標為[1-6],高度為1面積為6的矩形。

思路:暴力遍歷

1:從下標i開始,對於每乙個高度heigh[i]=h,向左遍歷,如果j<0或heigh[j]< heigh[i],此時h_left=j,即為左邊界;

2:向右遍歷,若j>length(heigh)或heigh[j] < heigh[i],此時h_right=j,即右邊界;

3:計算以當前heigh[i]為高,(h_right-h_left-1)為寬的面積並更新最大面積;

4:判斷:若i> length(heigh),則中斷迴圈,否則繼續從1開始,i=i+1.

偽**如下:

max_size(heigh)

}for(j=i+1;j

}w=h_right-h_left-1;

s_cur=h*w;

max_s=max(max_s,s_cur)}}

該演算法的時間複雜度為o(n^2).

考慮能否在o(n)內完成。

我們找出上圖中最大面積並總結規律如下:

1:最大面積中至少包含乙個完整的直方;

2:最大面積包含的完整直方對其左右臨界的關係:

heigh(h_left) < heigh(i);

heigh(h_right)< heigh(i).

即如上圖所示,最大面積包含了高度為3的直方,其左右臨界位置2,6的高度均低於3.。

由此做出以下推斷:

(1)若h(i+1)< h(i)

則 i+1必為以heigh(i)為高度的矩形面積右邊界

(2)若h(i-1)< h(i)

則i-1必為以heigh(i)為高度的矩形面積左邊界

那麼基於以上規律

若h(i)> h(i-1),則將i放入儲存空間,i=i+1,迴圈直至h(i-1)>h(i),此時,i必為h(i-1)的右邊界,依次彈出儲存空間中的索引=index,直至heigh(index)< heigh(i-1),此時的index為i-1的左邊界,求出以heigh(i-1)為高,i-index-1為寬的矩形面積並更新最大面積。

對於儲存空間,我們選擇 棧。

以下為操作流程:

(1)當直方的高度高於棧頂位置的高度,必知棧頂位置矩形為當前直方的左邊界,此刻無法得知右邊界,除了講當前直方壓入棧,我們什麼都不做;

棧中只存放矩形的下標

(2)當前直方高度小於棧頂矩形高度時:根據總結規律(1)知,當前直方為棧頂矩形的右邊界,此時,以棧頂矩形高度為高,依次彈棧,直至找到棧中某一index,使heigh(index)小於棧頂矩形的高度(或棧為空)並作為左邊界;

當i為3時,heigh(3)< heigh(s.top=2),此時彈出棧頂的2,index=2;

(3)index=2,高度為4的矩形,寬度為1的矩形面積為4,並更新最大面積;

將索引為2,高度為4的矩形彈出棧後,可以視作[1-2]的矩形如上圖所示,因為高度為4的矩形此時若不是最大面積,則之後也不會是,繼續比較heigh(3)

max_size(heigh)

else}}

}

最後,基於以上偽**並將其改進後,c++實現如下:

#include "stdafx.h"

#include "stack"

using

namespace

std;

void max_size(int heigh,int len)

else}}

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

}int _tmain(int argc, _tchar* argv)

; max_size(heigh,4);

return

0;}

10 18 最大面積 2432

學過初三數學或圓的相關知識的人都會求陰影部分面積。垂徑定理和勾股定理 s陰 a r2 1 2 a 2 b r 2 1 2 b 2 a b 然後就可以列舉a,b找最大值 a,b 2r var r,a,b,i,j longint c,max,b1,a1 double begin readln r for...

島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...

島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...