描述:在下列非負陣列中找出最大面積
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...