題目:
Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.
If it is impossible to form any triangle of non-zero area, return 0.
題目原意是:給出一個正整數數組,如果其中3個數能構成三角形,那麼求得:在所有滿足條件的三角形中,周長最大的那個。如果不能構成三角形,則返回0
例如:
Input: [3,6,2,3]
Output: 8
Input: [1,2,1]
Output: 0
假設條件
首先,判斷數據是否能夠成三角形所滿足的條件:
1:兩邊之差小於第三邊
2:兩邊之和大於第三邊
解題思路
因爲涉及到前後數據的比較,首先考慮對數組A進行排序(降序)。
那麼就有: A[i] >= A[i+1], 同樣A[i+1] >= A[i+2],也就是A[i] >= A[i+1] >= A[i+2]
針對:兩邊之和大於第三邊
則條件必須有:
- A[i] + A[i+1] > A[i+2]
- A[i] + A[i+2] > A[i+1]
- A[i+1] + A[i+2] > A[i]
而在數據A降序排好後,已經有了A[i] >= A[i+1] >= A[i+2],所以上述條件中前面兩個一定是成立的。因此針對兩邊之和大於第三邊的要求,我們只需要判斷條件3:A[i+1] + A[i+2] > A[i]是否成立。
針對:兩邊之差小於第三邊
則條件必須有:
4. A[i] - A[i+1] < A[i+2]
5. A[i] - A[i+2] < A[i+1]
6. A[i+1] - A[i+2] < A[i]
同樣,在數據A降序排好後,A[i+1]和A[i+2] 都是小於A[i] 的,因此,條件6是一定成立的,而觀察條件4和5,都是要求滿足A[i] < A[i+2] + A[i+1],可以觀察到,與條件3是等價的。
因此,針對兩邊之和大於第三邊 和 兩邊之差小於第三邊 這兩個要求,降序排好後的數據,都必須滿足一個條件:A[i] < A[i+2] + A[i+1]。
而且數組A經過降序排好後,只要發現第一次滿足的3個數據,一定是求和(三角形周長)最大的,可以直接返回求和(周長最大值結果)。
Python代碼
def largestPerimeter(self, A):
A = sorted(A)[::-1]
for i in range(len(A) - 2):
if A[i] < A[i + 1] + A[i + 2]:
return A[i] + A[i + 1] + A[i + 2]
return 0
Java代碼
public int largestPerimeter(int[] A) {
Arrays.sort(A);
for (int i = A.length - 1; i > 1; --i)
if (A[i] < A[i - 1] + A[i - 2])
return A[i] + A[i - 1] + A[i - 2];
return 0;
}