「这是我参与11月更文挑战的第 16 天,活动详情查看:2021最后一次更文挑战」
原题链接
976. 三角形的最大周长 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0。
测试用例
示例 1:
输入: [2,1,2]
输出: 5
示例 2:
输入: [1,2,1]
输出: 0
参数限制
3 <= A.length <= 100001 <= 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;
};
今天的力扣刷题就分享到这里,感谢大家的阅读~