LeetCode-三角形最大的周长
题目
给定由一些正数(代表长度)组成的数组 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。
我的错误解答
class Solution {
public int largestPerimeter(int[] nums) {
int a,b,c,result=0,temp=0;
for(int i=0;i<nums.length;i++){
a=nums[i];
for(int j=0;j<nums.length;j++){
if(j==i){
continue;
}
b=nums[j];
for(int k=0;k<nums.length;k++){
if(i==k||j==k){
continue;
}
c=nums[k];
if(xxx(a,b,c)){
temp=a+b+c;
}
result=Math.max(result,temp);
}
}
}
return result;
}
private boolean xxx(int a,int b,int c){
return a + b > c && a + c > b && b + c > a;
}
}
官方题解
方法一:贪心 + 排序
不失一般性,我们假设三角形的边长 a,b,c 满足 a≤b≤c,那么这三条边组成面积不为零的三角形的充分必要条件为 a+b>c。
基于此,我们可以选择枚举三角形的最长边 c,而从贪心的角度考虑,我们一定是选「小于 c 的最大的两个数」作为边长 a 和 b,此时最有可能满足 a+b>c,使得三条边能够组成一个三角形,且此时的三角形的周长是最大的。
因此,我们先对整个数组排序,倒序枚举第 i 个数作为最长边,那么我们只要看其前两个数 A[i−2] 和 A[i−1],判断 A[i−2]+A[i−1] 是否大于 A[i] 即可,如果能组成三角形我们就找到了最大周长的三角形,返回答案 A[i−2]+A[i−1]+A[i] 即可。如果对于任何数作为最长边都不存在面积不为零的三角形,则返回答案 0。
作者:力扣官方题解
链接:https://leetcode.cn/problems/largest-perimeter-triangle/solutions/501924/san-jiao-xing-de-zui-da-zhou-chang-by-leetcode-sol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public int largestPerimeter(int[] nums) {
Arrays.sort(nums);
for(int i=nums.length-1;i>=2;i--){
if(nums[i-2]+nums[i-1]>nums[i]){
return nums[i-2]+nums[i-1]+nums[i];
}
}
return 0;
}
}
思考
首先,没看懂题目,就急于下手去写代码了;其次对贪心算法理解不够,对其应用实践不够,对三角形的概念理解的不够深入。

浙公网安备 33010602011771号