持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 4 天,点击查看活动详情
题目链接
题目描述
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
测试用例
用例1:
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
限制
- 3 <= points.length <= 50.
- 不存在重复的点。
- -50 <= points[i][j] <= 50.
- 结果误差值在 10^-6 以内都认为是正确答案。
题目分析
题目需要我们从点的集合中,取出任意 3 个点,去求可以组成的最大面积。
解决的方案为:通过三层 for 循环,枚举所有的可能的情况,去计算这个组合下的面积,更新并记录下最大面积
如果使用常规的三角形面积计算公式: ,我们无法有效的求出 h 的值,故不考虑此方案
通过百度查找可知另外的几种计算方式:
1、海伦公式
p 表示半周长,a,b,c 表示三角形的 3 条边
2、行列式形式
三角形 3 个点的坐标分别为 A(a,b), B(c,d), C(e,f),有如下计算公式:
由于题目提供的都是 点坐标 的形式,故考虑使用行列式的形式来计算面积
代码实现
完整的代码实现如下
var largestTriangleArea = function(points) {
let n = points.length;
let sum = 0.0;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
for (let k = j + 1; k < n; k++) {
sum = Math.max(sum, triangleArea(points[i][0], points[i][1], points[j][0], points[j][1], points[k][0], points[k][1]));
}
}
}
return sum;
function triangleArea (x1, y1, x2, y2, x3, y3){
return 0.5 * Math.abs(x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2);
}
};