java算法: 三角形的最大周长

问题:

  • 给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、
    面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

解决:

  class Solution {
    public int largestPerimeter(int[] nums) {

        Arrays.sort(nums);     //将数组以升序排序,sort()是Arrays的函数
        for(int i=nums.length-1;i>=2;--i){          //i取数组最大元素
            if(nums[i]<(nums[i-1]+nums[i-2])){
                return nums[i]+nums[i-1]+nums[i-2];
            }
        }
        return 0;
    }
}

// 因为三条边关系:a=《b=《c,找出“最长边c”
// 要的得到最大周长,则另外两条边要为小于c的最长的两条,
// 此时的a+b>c,则周长最大
// 如果以任意c作为最长边,得到的a,b都不满足a+b>c,则返回0

总结:

贪心+排序算法

  • 官方解释
    不失一般性,我们假设三角形的边长 a,b,ca,b,c 满足 a \leq b \leq ca≤b≤c,那么这三条边组成面积不为零的三角形的充分必要条件为 a+b>ca+b>c。

    基于此,我们可以选择枚举三角形的最长边 cc,而从贪心的角度考虑,我们一定是选「小于 cc 的最大的两个数」作为边长 aa 和 bb,
    此时最有可能满足 a+b>ca+b>c,使得三条边能够组成一个三角形,且此时的三角形的周长是最大的。

    因此,我们先对整个数组排序,倒序枚举第 ii 个数作为最长边,那么我们只要看其前两个数 A[i-2]A[i−2] 和 A[i-1]A[i−1],
    判断 A[i-2]+A[i-1]A[i−2]+A[i−1] 是否大于A[i]A[i] 即可,如果能组成三角形我们就找到了最大周长的三角形,
    返回答案 A[i-2]+A[i-1]+A[i]A[i−2]+A[i−1]+A[i] 即可。如果对于任何数作为最长边都不存在面积不为零的三角形,则返回答案 00。

链接:https://leetcode.cn/problems/largest-perimeter-triangle/solution/san-jiao-xing-de-zui-da-zhou-chang-by-leetcode-sol/
来源:力扣(LeetCode)

posted @ 2022-06-22 19:58  new_monkey  阅读(200)  评论(0编辑  收藏  举报