给定由一些正数(代表长度)组成的数组 nums
,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0
。
示例 1:
输入:nums = [2,1,2] 输出:5 解释:你可以用三个边长组成一个三角形:1 2 2。
示例 2:
输入:nums = [1,2,1,10] 输出:0 解释: 你不能用边长 1,1,2 来组成三角形。 不能用边长 1,1,10 来构成三角形。 不能用边长 1、2 和 10 来构成三角形。 因为我们不能用任何三条边长来构成一个非零面积的三角形,所以我们返回 0。
提示:
3 <= nums.length <= 104
1 <= nums[i] <= 10
方法一:暴力for循环枚举,但基本都会超时,所以意义不大(笔者首先想到也是枚举)
方法二:从题目入手分析,首先要组成一个三角形,那就必须满足三角形的性质,两边和大于第三边;其次,在满足性质的条件下,要返回最大周长,所以可以使用排列,从边长长的开始循环判断
class Solution {
public:
int largestPerimeter(vector<int>& nums) {
int len=nums.size();
sort(nums.begin(),nums.end());
for(int i=len-1;i>=2;i--){
int a=nums[i];
int b=nums[i-1];
int c=nums[i-2];
if(b+c>a) return a+b+c;
}
return 0;
}
};
为什么是从nums[i],nums[i-1],nums[i-2]一起进行判断呢,首先假设a>b>c>d,abc三者不能形成三角形,则abd也必定不能,所以我们以c为标准,abc三者形成的三角形才是最长的三角形
注意,在判断是否满足三角形性质时,应该用短的两边相加去判断