题目:
You have a list of points in the plane. Return the area of the largest triangle that can be formed by any 3 of the points.
Example:Input: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] Output: 2 Explanation: The five points are show in the figure below. The red triangle is the largest.
Notes:
3 <= points.length <= 50
.
No points will be duplicated.
-50 <= points[i][j] <= 50
.
Answers within10^(-6)
of the true value will be
accepted as correct.
解释:
给一若干个点,给出能构成的三角形的最大的面积。
需要用到一个公式:
给定三个点的坐标(x1,y1),(x2,y2),(x3,y3),则构成的三角形的面积为:
s=(1/2.0)*abs(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
python中可以用itertools.combinations
取得三个点,c++中需要三重循环?
python代码:
class Solution(object):
def largestTriangleArea(self, points):
"""
:type points: List[List[int]]
:rtype: float
"""
combinations=itertools.combinations(points,3)
_max=0
for com in list(combinations):
point1,point2,point3=com[0],com[1],com[2]
x1,y1=point1
x2,y2=point2
x3,y3=point3
s=(1/2.0)*abs(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
_max=max(_max,s)
return _max
c++代码:
class Solution {
public:
double largestTriangleArea(vector<vector<int>>& p) {
double res = 0;
int _len=p.size();
for (int i=0;i<_len;i++)
{
for (int j=i+1;j<_len;j++)
{
for (int k=j+1;k<_len;k++)
{
int x1=p[i][0],y1=p[i][1],x2=p[j][0],y2=p[j][1],x3=p[k][0],y3=p[k][1];
double s=0.5*abs(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1);
res=max(res,s);
}
}
}
return res;
}
};
总结:
c++在循环的时候注意循环初始条件,不要重复选取点,可以节省很多时间。