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;
	}
}

思考

首先,没看懂题目,就急于下手去写代码了;其次对贪心算法理解不够,对其应用实践不够,对三角形的概念理解的不够深入。

posted @ 2025-06-23 10:58  尼兰  阅读(12)  评论(0)    收藏  举报