1、题目描述:
2、题解:
方法1:海伦公式:
面积s=sqrt(l(l-a)(l-b)(l-c))
l = (a+b+c) / 2
用三次循环,去遍历所有的可能三角形的面积,记录最大值
python代码如下:
class Solution:
def largestTriangleArea(self, points) :
#海伦公式:
# 面积s=sqrt(l(l-a)(l-b)(l-c))
# l = (a+b+c) / 2
def getlength(p1,p2):
return ((p1[0]-p2[0]) ** 2 + (p1[1]-p2[1]) ** 2) ** 0.5
res = 0.0
for i in range(len(points) - 2):
for j in range(i+1,len(points) - 1):
for k in range(j+1,len(points)):
a = getlength(points[i],points[j])
b = getlength(points[i],points[k])
c = getlength(points[j],points[k])
p = (a + b + c) / 2
s = (p * abs(p - a) * abs(p - b) * abs(p - c)) ** 0.5 #要加三个abs(),否则会报错
res = max(res,s)
return res
方法2:“鞋带公式”
在竞赛中用的比较多,求多边形的面积公式:
所以三角形A(x1,y1),B(x2,y2),C(x3,y3),的面积为
s = |x1* y2 + x2 * y3 + x3 * y1 - (x2 * y1 + x3 * y2 + x1 * y3)| / 2
用三次循环,去遍历所有的可能三角形的面积,记录最大值
python代码如下:
class Solution:
def largestTriangleArea(self, points) :
#鞋带公式
def getaera(p1,p2,p3):
return abs(p1[0]*p2[1] + p2[0]*p3[1] + p3[0]*p1[1] - (p2[0]*p1[1] + p3[0]*p2[1] + p1[0]*p3[1])) / 2
res = 0.0
for i in range(len(points) - 2):
for j in range(len(points) - 1):
for k in range(len(points)):
res = max(res,getaera(points[i],points[j],points[k]))
return res
方法3:转化为矩阵
python代码如下:
class Solution:
def largestTriangleArea(self, points) :
def getarea(p1,p2,p3):
dx1 = p2[0] - p1[0]
dx2 = p3[0] - p1[0]
dy1 = p2[1] - p1[1]
dy2 = p3[1] - p1[1]
return abs(dx1 * dy2 - dx2 * dy1) / 2
res = 0.0
# print(abs(4))
for i in range(len(points) - 2):
for j in range(i+1,len(points) - 1):
for k in range(j+1,len(points)):
res = max(res,getarea(points[i],points[j],points[k]))
return res
3、复杂度分析:
时间复杂度:O(N^3)
空间复杂度:O(1)