给定由一些正数(代表长度)组成的数组 A
,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0
。
示例 1:
输入:[2,1,2]
输出:5
示例 2:
输入:[1,2,1]
输出:0
示例 3:
输入:[3,2,3,4]
输出:10
示例 4:
输入:[3,6,2,3]
输出:8
提示:
3 <= A.length <= 10000
1 <= A[i] <= 10^6
解题思路
这个问题在比赛的时候卡了我很长时间。我们知道判断三个边能不能构成三角形,我们只需要判断(a+b)>c and (a+c)>b and (b+c)>a
。但是我们如果判断所有的三种组合显然是不切实际的,因为输入的A
是10^4
级别的。
但是其实我们一直忽略了一个问题,我们上述之所以通过三次判断是因为我们不知道a,b,c
的大小关系,假设a>b>c
的话,我们实际上只需要判断b+c>a
即可,也就是判断最小的两个值的和是不是最大值即可。那么问题就变得简单了,我们只需要将A
反排序,然后判断A[i+1]+A[i+2]>A[i]
即可,如果成立的话,那么第一个成立的三条边肯定就是最大的周长了。
class Solution:
def largestPerimeter(self, A):
"""
:type A: List[int]
:rtype: int
"""
A.sort(reverse=True)
for i in range(len(A)-2):
if A[i+2] + A[i+1] > A[i]:
return A[i] + A[i+1] + A[i+2]
return 0
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!