2013-11-25 121 views
-1

有一個數組包含三角形的可能長度。找出哪三個長度可以建立最大的三角形。給定一組三角形的長度,找到最大面積三角形

我可以計算所有可能的三角形區域(Heron公式)來找到最大值,但運行時間很糟糕。如何設計一個運行時間爲(n * n)的算法?

+0

什麼讓你覺得O(n^2)運行時間不會太糟糕? –

+0

@Geobits三角形區域(6,6,6)大於三角形區域(6,6,7) –

+0

@Geobits我認爲你是對的 –

回答

2

我相信你可以在線性時間內解決這個問題,不同之處在於你必須首先排序你的三角形長度集合,即O(nlogn)。

下面是我該怎麼做。

僞代碼:

// V is the set of length of triangle. 

Order(V) 

// Heron Formula 
define A(a,b,c) = SQRT(4a^2*b^2 - (a^2 + b^2 - c^2) ^2)/4 

// I is the last position in V 
I := V.length - 1 

// T(I) is the area of Maximum Area Triangle 
T(I) = 
if V[I]^2 <= V[I-1]^2+V[I-2]ˆ2 
    then return A(V[I-2],V[I-1],V[I]) 
else 
    return MAX(A(V[I-2],V[I-1],V[I]), T(I-1)) 

說明: 假設C> = B> = A,當c^2 < = A^2 + B^2,如果增加任何變量( a,b或c),您將擁有一個面積較大的三角形。因此,如果您對三個最大的數字進行峯化,並且等式c^2 < = a^2 + b^2是正確的,那意味着您找到了最大的區域。但是,如果c^2 < = a^2 + b^2不是真的,那就是c^2> a^2 + b^2,比具有不同設置的三角形可能具有更大的面積。如果我們改變b或a的值較低,我們是否會有較低的面積,所以這不是一個選項。所以,我們唯一的選擇是爲c選擇一個diferente值,即T(I-1),這也是一個遞歸。 A(V [I-2],V [I-1],V [I])和T(I-1)之間的最大值將成爲您的答案。