携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
一、题目描述:
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
注意:
- 3 <= points.length <= 50.
- 不存在重复的点。
- -50 <= points[i][j] <= 50.
- 结果误差值在 10^-6 以内都认为是正确答案。
二、思路分析:
这道题最大的问题在于使用什么方法来计算给定三个点后的三角形面积,在这里我用的是向量叉积计算两向量组成平行四边形面积后再取其一半的方法,简单易懂易实现。
我们知道如果存在一个大于其他所有三角形面积的三角形,那它的三个顶点必然位于所有点构成区域的最外侧轮廓上,因此,可以采用先计算出凸包,再位于凸包上遍历寻找的方法来减少搜索空间,比如官解给出用Andrew算法就可以。我使用了最简单的暴力循环,复杂度为O(n^3)。
三、AC 代码:
class Solution {
public:
double area(int x1, int y1, int x2, int y2, int x3, int y3)
{
int v1i = x2 - x1;
int v1j = y2 - y1;
int v2i = x3 - x1;
int v2j = y3 - y1;
double ans = abs(v1i * v2j - v1j * v2i);
return ans;
}
double largestTriangleArea(vector<vector<int>>& points)
{
if (points.size() == 0) return 0;
double ans = 0;
int n = points.size();
for (int i = 0; i < n - 2; i++)
{
for (int j = i + 1; j < n - 1; j++)
{
for (int k = j + 1; k < n; k++)
{
ans = max(ans, area(points[i][0], points[i][1], points[j][0], points[j][1], points[k][0], points[k][1]));
}
}
}
return ans / 2;
}
};