812. 最大三角形面积
812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
方法一:三角形面积公式
三角形ABC的面积=梯形BDEA+梯形AEFC-梯形BDFC
=1/2*(y1+y2)(x1-x2)+1/2*(y1+y3)(x3-x1)-1/2*(y2+y3)(x3-x2)
=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
class Solution { public double largestTriangleArea(int[][] points) { int length = points.length; double res = 0; for (int i = 0; i < length; i++) { for (int j = i + 1; j < length; j++) { for (int k = j + 1; k < length; k++) { res = Math.max(res, getLargestTriangleArea( points[i][0], points[i][1], points[j][0], points[j][1], points[k][0], points[k][1] )); } } } return res; } double getLargestTriangleArea(int x1, int y1, int x2, int y2, int x3, int y3) { return 0.5 * Math.abs(x1 * y2 + x2 * y3 + x3 * y1 - y1 * x2 - y2 * x3 - y3 * x1); } }
方法二:海伦公式
class Solution { public double largestTriangleArea(int[][] points) { int length = points.length; double res = 0; for (int i = 0; i < length; i++) { for (int j = i + 1; j < length; j++) { for (int k = j + 1; k < length; k++) { res = Math.max(res, getLargestTriangleArea( points[i][0], points[i][1], points[j][0], points[j][1], points[k][0], points[k][1] )); } } } return res; } double getLargestTriangleArea(int x1, int y1, int x2, int y2, int x3, int y3) { double a = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); double b = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)); double c = Math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); double p = 0.5 * (a + b + c); Double s = Math.sqrt(p * (p - a) * (p - b) * (p - c)); return s.isNaN() ? 0 : s;