算法笔记 -- 812. 最大三角形面积

152 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

一、题目描述:

812. 最大三角形面积 - 力扣(LeetCode)

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

示例:

输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释: 
这五个点如下图所示。组成的橙色三角形是最大的,面积为2

image.png

注意:

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

二、思路分析:

已证明先寻找两个距离最远点再遍历其余所有点(复杂度O(n^2))的方法理论上不可行,暂未找到复杂度低于O(n^3)的解法;
根据三个点的坐标可以直接计算面积,公式为:S=|x1y2+x2y3+x3y1-y1x2-y2x3-y3x1|/2.0,或者S=|x1(y2-y3)+x2(y3-y1)+x3(y1-y2)|/2.0;
可以依据S=(1/2)|a||b|sinθ及ab=|a|*|b|*cosθ进行推导证明。
整数或零右移31位得到0,负数右移31位得-1,右移31位再加上1/2得到的是正负(1/2),乘以原数字可以同时达到取绝对值和除以2的效果,事实证明这个骚操作对于提升效率没什么卵用。

三、AC 代码:

class Solution {
    public double largestTriangleArea(int[][] points) {
        double max = 0.0;
        double area;
        for(int i = 0; i < points.length - 2; i ++)
            for(int j = i + 1; j < points.length - 1; j ++)
                for(int k = j + 1; k < points.length; k ++)
                    max = Math.max(max, getArea(points[i], points[j], points[k]));
        return max;
    }

    public double getArea(int[] point1, int[] point2, int[] point3){
        int res = point1[0]*(point2[1]-point3[1]) + point2[0]*(point3[1]-point1[1]) + point3[0]*(point1[1]-point2[1]);
        return res * ( (res >> 31) + 0.5 );
    }
}

范文参考:

【zljhero】【C语言】最大三角形面积:已知三点,求三角形面积公式 - 最大三角形面积 - 力扣(LeetCode)

是我做复杂了么?海伦公式 +勾股定理+ DFS - 最大三角形面积 - 力扣(LeetCode)