给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
注意:
3 <= points.length <= 50.
不存在重复的点。
-50 <= points[i][j] <= 50.
结果误差值在 10^-6 以内都认为是正确答案。
链接:https://leetcode-cn.com/problems/largest-triangle-area
思路:暴力法+三角形求面积公式
法1:计算三角形面积的方法,可以转化成已知三角形三边a, b, c 使用海伦公式求解:
inline double getLength(int *point1, int *point2)
{
return sqrt((point1[0]-point2[0])*(point1[0]-point2[0]) + \
(point1[1]-point2[1])*(point1[1]-point2[1]));
}
double largestTriangleArea(int** points, int pointsSize, int* pointsColSize){
int i, j, k;
double a;
double b;
double c;
double p;
double s;
double ret;
for(i = 0; i < pointsSize - 2; i++) {
for(j = i + 1; j < pointsSize - 1; j++) {
for(k = j + 1; k < pointsSize; k++) {
a = getLength(points[i],points[j]);
b = getLength(points[i],points[k]);
c = getLength(points[j],points[k]);
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
ret = ret < s ? s : ret;
}
}
}
return ret;
}
法2:计算三角形面积的方法,已知三角形三个坐标,直接求面积的公式:
inline double getS(int x1, int y1, int x2, int y2, int x3, int y3) {
return ((double)abs((x1*y2-y1*x2) + (x2*y3-y2*x3) + (x3*y1-y3*x1))) / 2;
}
double largestTriangleArea(int** points, int pointsSize, int* pointsColSize){
int i, j, k;
double s;
double ret;
for(i = 0; i < pointsSize - 2; i++) {
for(j = i + 1; j < pointsSize - 1; j++) {
for(k = j + 1; k < pointsSize; k++) {
s = getS(points[i][0],points[i][1],points[j][0],points[j][1],points[k][0],points[k][1]);
ret = ret < s ? s : ret;
}
}
}
return ret;
}