算法提高之LeetCode刷题算法

812. 最大面积三角形(Python)

2019-05-28  本文已影响0人  玖月晴

题目

难度:★★☆☆☆
类型:几何

给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。

示例

输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2

解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。


三角形的最大面积

解答

已知三角形的三个顶点,求三角形的面积:

证明:

假设一个三角形有三个顶点P1(x1, y1), P2(x2, y2), P3(x3, y3),底边为P2P3,则底边长

\left | P_{2}P_{3} \right |=\sqrt{\left (x_{3}-x_{2} \right )^2+ \left(y_{3}-y_{2} \right )^2}

底边所在的直线方程是:

y-y_{3}=\frac{y_{3}-y_{2}}{x_{3}-x_{2}}\left ( x-x_{3} \right )

化简为:

\left ( y_{3}-y_{2} \right )x-\left ( x_{3}-x_{2} \right )y+y_{2}x_{3}-x_{2}y_{3}=0

过P1作底边P2P3的高,根据点到直线的距离公式:

dist\left ( \left ( x_{0},y_{0} \right ), Ax+By+C=0 \right )=\frac{\left | Ax_{0}+By_{0}+C \right |}{\sqrt{A^{2}+B^{2}}}

可得高为点P1到直线P2P3的距离:

\left | P_{1}H \right |=\frac{x_{1}y_{3}-x_{3}y_{1}+x_{2}y_{1}-x_{1}y_{2}+x_{3}y_{2}-x_{2}y_{3}}{\sqrt{\left ( y_{3}-y_{2} \right )^{2}+\left ( x_{3}-x_{2} \right )^{2}}}

因此三角形的面积为:

S=\frac{1}{2}\left | P_{1}H \right |\left | P_{2}P_{3} \right |=\frac{1}{2}\left | x_{1}y_{3}-x_{3}y_{1}+x_{2}y_{1}-x_{1}y_{2}+x_{3}y_{2}-x_{2}y_{3} \right |

我们使用暴力法遍历所有可能的三点组合。

class Solution:
    def largestTriangleArea(self, points):
        from itertools import combinations
        amax = 0
        for c in combinations(points, 3):
            x1, x2, x3, y1, y2, y3 = c[0][0], c[1][0], c[2][0], c[0][1], c[1][1], c[2][1]
            s = abs(x1*y3-x3*y1+x2*y1-x1*y2+x3*y2-x2*y3)/2
            amax = max(s, amax)
        return amax

如有疑问或建议,欢迎评论区留言~

上一篇下一篇

猜你喜欢

热点阅读