持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
一、题目描述:
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
注意:
- 3 <= points.length <= 50.
- 不存在重复的点。
- -50 <= points[i][j] <= 50.
- 结果误差值在 10^-6 以内都认为是正确答案。
二、思路分析:
已证明先寻找两个距离最远点再遍历其余所有点(复杂度O(n^2))的方法理论上不可行,暂未找到复杂度低于O(n^3)的解法;
根据三个点的坐标可以直接计算面积,公式为:S=|x1y2+x2y3+x3y1-y1x2-y2x3-y3x1|/2.0,或者S=|x1(y2-y3)+x2(y3-y1)+x3(y1-y2)|/2.0;
可以依据S=(1/2)|a||b|sinθ及ab=|a|*|b|*cosθ进行推导证明。
整数或零右移31位得到0,负数右移31位得-1,右移31位再加上1/2得到的是正负(1/2),乘以原数字可以同时达到取绝对值和除以2的效果,事实证明这个骚操作对于提升效率没什么卵用。
三、AC 代码:
class Solution {
public double largestTriangleArea(int[][] points) {
double max = 0.0;
double area;
for(int i = 0; i < points.length - 2; i ++)
for(int j = i + 1; j < points.length - 1; j ++)
for(int k = j + 1; k < points.length; k ++)
max = Math.max(max, getArea(points[i], points[j], points[k]));
return max;
}
public double getArea(int[] point1, int[] point2, int[] point3){
int res = point1[0]*(point2[1]-point3[1]) + point2[0]*(point3[1]-point1[1]) + point3[0]*(point1[1]-point2[1]);
return res * ( (res >> 31) + 0.5 );
}
}
范文参考:
【zljhero】【C语言】最大三角形面积:已知三点,求三角形面积公式 - 最大三角形面积 - 力扣(LeetCode)