数学法(本题可以记一下“鞋带公式”:力扣812. 最大三角形面积

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值