【力扣刷题】976. 三角形的最大周长【简易贪心+排序】

251 阅读1分钟

「这是我参与11月更文挑战的第 16 天,活动详情查看:2021最后一次更文挑战

原题链接

976. 三角形的最大周长 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。

如果不能形成任何面积不为零的三角形,返回 0

测试用例

示例 1:

输入: [2,1,2]
输出: 5

示例 2:

输入: [1,2,1]
输出: 0

参数限制

  1. 3 <= A.length <= 10000
  2. 1 <= A[i] <= 10^6

分析

三角形由 3 条直线围合而成,一个有效的三角形,其中任意两条边长之和,必定大于第三条边;换个说法,在极限的情况下,只要当最小的两条边之和若大于第三条边,则此是一个有效的三角形

题目给定一个起码包含有 3 个元素的数组,我们需要在里面尽可能的找到 3 个数来组合三角形,并使得这 3 个数的和最大;如果没有找到,需要返回 0

常规的做法就是,我们先找到最大的3个数,最大的一个数是否小于另外两个数之和。如果不满足,那即使我们更换上比这两个数还小的数,同样也无法构成三角形。这种情况下,我们只能使用第二大的数做长边,第 3, 4 大的数做短边,然后比较。直到找到符合要求的数

代码

基于上面的分析,我们需要一个 降序 排序后的数组,然后从头往后一位位遍历,每次都是一次选取 3 个数,来判断是否符合三角形的定义,即取下标的方式为 [0,1,2], [1,2,3], [2,3,4] 这种方式,代码如下

最后,记得返回符合条件要求的边长总数即可(或者是 0)

var largestPerimeter = function(nums) {
    nums = nums.sort((a, b) => b - a);
    let c = 0;
    for (let i = 0; i < nums.length - 2; i++) {
        if (nums[i] < nums[i+1] + nums[i+2]) {
            c = nums[i] + nums[i+1] + nums[i+2];
            break;
        }
    }
    return c;
};

image.png


今天的力扣刷题就分享到这里,感谢大家的阅读~