三角形的最大周长
难度:简单
给定由一些正数(代表长度)组成的数组 nums ,返回由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
示例 1:
输入:nums = [2,1,2]
输出:5
示例 2:
输入:nums = [1,2,1]
输出:0
解法一、贪心 + 排序
思路:
假设三角形的边长 a,b,c 满足 a≤b≤c,那么这三条边组成面积不为零的三角形的充分必要条件为 a+b>c。
基于此,可以选择枚举三角形的最长边 c,而从贪心的角度考虑,一定是选「小于 c 的最大的两个数」作为边长 aaa 和 bbb,此时最有可能满足 a+b>c,使得三条边能够组成一个三角形,且此时的三角形的周长是最大的。
因此,先对整个数组排序,倒序枚举第 iii 个数作为最长边,那么只要看其前两个数 nums[i−2] 和 nums[i−1],判断 nums[i−2]+nums[i−1]是否大于 nums[i] 即可,如果能组成三角形就找到了最大周长的三角形,返回答案 nums[i−2]+nums[i−1]+nums[i] 即可。如果对于任何数作为最长边都不存在面积不为零的三角形,则返回答案 0。
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),其中 n 是数组 nums 的长度。
空间复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn),不知道为啥是 logn 而不是 n,求解,不该是排序的空间复杂度吗?
class Solution:
def largestPerimeter(self, nums: List[int]) -> int:
nums.sort()
for i in range(len(nums)-1, 1, -1):
if nums[i-1] + nums[i-2] > nums[i]:
return nums[i] + nums[i-1] + nums[i-2]
return 0
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/largest-perimeter-triangle/