LeetCode:976. Largest Perimeter Triangle---構造三角形

題目:

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]

 

針對:兩邊之和大於第三邊

則條件必須有:

  1. A[i] + A[i+1] > A[i+2]
  2. A[i] + A[i+2] > A[i+1]
  3. 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章