力扣,812. 最大三角形面积(用行列式求法)

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

示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
力扣,812. 最大三角形面积(用行列式求法)_第1张图片

注意:

3 <= points.length <= 50.
不存在重复的点。
-50 <= points[i][j] <= 50.
结果误差值在 10^-6 以内都认为是正确答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-triangle-area
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
写题思路:一开始想的是先求出两点间距离最大值,之后将这两个点的直线公式求出来,将两直线距离公式搞出来求最大距离,这三个点就求完了,最后利用底乘高除以2求出,但是太麻烦我实在是写不下去,之后去评论区看看,发现竟然是用的行列式求平行四边形的面积求解(长知识了,这学期才学的线性代数,没想到会用到这里),之后看了看行列式的几何意义,一个起源是n维平行体的体积,行列式的定义和n维平行体的体积有着本质上的关联。
具体介绍及代码如下:

/*通过行列式去求平行四边形的面积,然后再把平行四边形的面积除以2,得到三角形面积*/
/*行列式和平行四边形的面积关系,证明如下:
  https://wenda.so.com/q/1461992684722271 */


double largestTriangleArea(int** points, int pointsRowSize, int *pointsColSizes) 
{
    int i, j, k, x1, x2, y1, y2, x3, y3;
    double p1x, p1y, p2x, p2y, max = 0.0;
    *pointsColSizes = 2;
    for(i = 0; i < pointsRowSize - 2; i++)
    {
        //起始点
        x1 = points[i][0];
        y1 = points[i][1];
        for(j = i + 1; j < pointsRowSize - 1; j++)
        {
            //第二个点
            x2 = points[j][0];
            y2 = points[j][1];
            for(k = j + 1; k < pointsRowSize; k++)
            {
    //第三个点,至此共有三个点,可构造两个向量,不需要再回头,因为向量这种东西换一下相减的位置,只是方向不一样,abs之后都是一样的
                x3 = points[k][0];
                y3 = points[k][1];
                p1x = x1 - x2;  //p1为第一个向量
                p1y = y1 - y2;
                p2x = x2 - x3;  //p2为第一个向量
                p2y = y2 - y3;
                max = max > abs(p1x * p2y - p2x * p1y) ? max : abs(p1x * p2y - p2x * p1y);
                           /*行列式:
                            |p1x  p1y| = p1x*p2y - p2x*p1y, 然后再取绝对值,面积不为负数
                            |p2x  p2y|                                                */
            }
        }
    }
    return 0.5 * max;  //除以2
}

你可能感兴趣的:(力扣,812. 最大三角形面积(用行列式求法))