1. 程式人生 > 其它 >812. 最大三角形面積

812. 最大三角形面積

812. 最大三角形面積

給定包含多個點的集合,從其中取三個點組成三角形,返回能組成的最大三角形的面積。

示例:
輸入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
輸出: 2
解釋: 
這五個點如下圖所示。組成的橙色三角形是最大的,面積為2。

 方法一:三角形面積公式

 三角形ABC的面積=梯形BDEA+梯形AEFC-梯形BDFC

        =1/2*(y1+y2)(x1-x2)+1/2*(y1+y3)(x3-x1)-1/2*(y2+y3)(x3-x2)

        =1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1

)

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

        double getLargestTriangleArea(int x1, int y1, int x2, int y2, int x3, int y3) {
            return 0.5 * Math.abs(x1 * y2 + x2 * y3 + x3 * y1 - y1 * x2 - y2 * x3 - y3 * x1);
        }
    }

方法二:海倫公式

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

    double getLargestTriangleArea(int x1, int y1, int x2, int y2, int x3, int y3) {
        double a = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        double b = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
        double c = Math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3));
        double p = 0.5 * (a + b + c);
        Double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));
        return s.isNaN() ? 0 : s;