1、题目描述
https://leetcode-cn.com/problems/largest-perimeter-triangle/
给定由一些正数(代表长度)组成的数组 A
,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0
。
输入:[2,1,2]
输出:5
输入:[1,2,1]
输出:0
输入:[3,2,3,4]
输出:10
输入:[3,6,2,3]
输出:8
3 <= A.length <= 10000
1 <= A[i] <= 10^6
2、代码详解
先排序,再判断:两边之和大于第三边
为什么排序遍历相邻元素可行,有没有可能最优解为非相邻元素?(不会)
证明:反证 假设 a , b, c 为最优解,且存在a',b',满足 a < a' < b < b' < c(存在非相邻元素)
- 由于 a + b > c,a < a', 有 a' + b > c,(a', b, c)优于(a, b, c),与(a, b, c)为最优解矛盾,故不存在a'
- b'同理不存在 由于 a + b > c, b < b',有a + b' > c,(a, b, c)为最优解矛盾,故不存在b'
因此最优解一定为排序后相邻元素
class Solution(object):
def largestPerimeter(self, A):
"""
:type A: List[int]
:rtype: int
"""
A.sort()
for i in range(len(A)-1, 1, -1):
a = A[i]
b = A[i-1]
c = A[i-2]
if a < b + c:
return a + b + c
return 0
A = [3, 6, 2, 3]
s = Solution()
print(s.largestPerimeter(A))