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;

浙公网安备 33010602011771号