刷题日记 812. 最大三角形面积

188 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

812. 最大三角形面积

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

示例:

输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释: 
这五个点如下图所示。组成的橙色三角形是最大的,面积为2

image.png

注意:

  • 3 <= points.length <= 50.
  • 不存在重复的点。
  •  -50 <= points[i][j] <= 50.
  • 结果误差值在 10^-6 以内都认为是正确答案。

二、思路分析:

  1. 计算边长,输入两点坐标[x1,y1] [x2,y2],输出 Math.sqrt(Math.pow(x1-x2,2) + Math.pow(y1-y2,2));
  2. 海伦公式计算面积,输入三边长 a b c,输出 1/4Math.sqrt((a+b+c)(a+b-c)(a-b+c)(-a+b+c)),注意判断开方里的正负,避免输出NaN;
  3. 遍历,找出最大面积。

三、AC 代码:

/**
 * @param {number[][]} points
 * @return {number}
 */
var largestTriangleArea = function(points) {
  let n = points.length
  let maxArea = 0
  for (let i=0; i<n-2; ++i) {
    for (let j=i+1; j<n-1; ++j) {
      for (let l=j+1; l<n; ++l) {
        maxArea = Math.max(maxArea, triangleArea(
          sideLength(points[i],points[j]),
          sideLength(points[i],points[l]),
          sideLength(points[j],points[l])))
      }
    }
  }
  
  return maxArea
  
  // 根据坐标计算边长
  function sideLength (arr1, arr2) {
    return Math.sqrt(Math.pow(arr1[0]-arr2[0],2) + Math.pow(arr1[1]-arr2[1],2))
  }

  // 海伦公式
  function triangleArea (a, b, c) { // 输入三边长
    return 1 / 4 * Math.sqrt((a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c) > 0 ? (a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c) : 0)
  }
};

范文参考:

根据三点坐标求三角形面积的鞋带公式!! - 最大三角形面积 - 力扣(LeetCode) (leetcode-cn.com)