【力扣】812. 最大三角形面积

118 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 4 天,点击查看活动详情

题目链接

812. 最大三角形面积 - 力扣(LeetCode)

题目描述

给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。

测试用例

用例1:

image.png

示例:
输入: 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 循环,枚举所有的可能的情况,去计算这个组合下的面积,更新并记录下最大面积


如果使用常规的三角形面积计算公式:S=ah/2S = ah/2 ,我们无法有效的求出 h 的值,故不考虑此方案

通过百度查找可知另外的几种计算方式:

1、海伦公式

p=(a+b+c)/2S=sqrt[p(pa)(pb)(pc)]p = (a+b+c)/2, S = sqrt[p(p-a)(p-b)(p-c)]

p 表示半周长,a,b,c 表示三角形的 3 条边

2、行列式形式

三角形 3 个点的坐标分别为 A(a,b), B(c,d), C(e,f),有如下计算公式:

image.png


由于题目提供的都是 点坐标 的形式,故考虑使用行列式的形式来计算面积

代码实现

完整的代码实现如下

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

image.png