算法刷题打卡第16天:三角形的最大周长

三角形的最大周长

难度:简单
给定由一些正数(代表长度)组成的数组 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(nlog⁡n) O(nlogn),其中 n 是数组 nums 的长度。
空间复杂度: O ( l o g ⁡ n ) O(log⁡n) 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值