zoukankan      html  css  js  c++  java
  • 812. Largest Triangle Area--Easy

    You have a list of points in the plane. Return the area of the largest triangle that can be formed by any 3 of the points.

    Example:
    Input: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
    Output: 2
    Explanation:
    The five points are show in the figure below. The red triangle is the largest.

    Notes:

    3 <= points.length <= 50.
    No points will be duplicated.
    -50 <= points[i][j] <= 50.
    Answers within 10^-6 of the true value will be accepted as correct.

    1.思考
    (1) 方法1

    • 一般计算三角形面积的公式有:底*高/2,但是在本题中,计算高较为困难;
    • 通过三点的坐标最直接能够计算出的是三角形三条边的长度,因此使用公式:p = (a+b+c)/2, s = sqrt( p*(p-a)*(p-b)*(p-c) ) = 1/4*sqrt( (a+b+c)(a+b-c)(a-b+c)(-a+b+c) );
      (2) 方法2
    • 在提交的某个参考代码中看出了另一种性能更好的方法,并通过数学证明的方法验证了该方法的正确性;
    • 示意图如下所示,假设组成三角形的三个顶点为I、J、K,下面我们将证明S△IJK=S△IBK+S△IAJ;
    • 因为AC:BC=AK:BJ,即ACBJ=BCAK,所以S△BCK=S△ACJ,得证。

    2.实现
    (1) 方法1
    Runtime: 12ms(47.50%)
    Memory: 9.1MB(75.00%)
    (2) 方法2
    Runtime: 4ms(98.04%)
    Memory: 9MB(100%)

    //Solution 1
    class Solution {
    public:
        double largestTriangleArea(vector<vector<int>>& points) {
            int len = points.size();
            double a, b, c;
            double s, res = 0, m;
            for(int i=0; i<len-2; i++){
                for(int j=i+1; j<len-1; j++){
                    for(int k=j+1; k<len; k++){
                        a = sqrt(pow(points[i][0]-points[j][0],2)+pow(points[i][1]-points[j][1],2));
                        b = sqrt(pow(points[i][0]-points[k][0],2)+pow(points[i][1]-points[k][1],2));
                        c = sqrt(pow(points[k][0]-points[j][0],2)+pow(points[k][1]-points[j][1],2));
                        s = (a+b+c)/2.0;
                        m = sqrt(s*(s-a)*(s-b)*(s-c));
                        if(m>res)
                            res = m;
                    }
                }    
            }        
            return res;        
        }
    };
    
    //Solution 2
    class Solution {
    public:
        inline double abs(double a){return a>0?a:(-a);}    
        double largestTriangleArea(vector<vector<int>>& points) {
            int len = points.size();
            double res = 0, m;
            for(int i=0; i<len-2; i++){
                for(int j=i+1; j<len-1; j++){
                    for(int k=j+1; k<len; k++){
                        m = 0.5 *abs((points[i][0]-points[j][0])*(points[i][1]-points[k][1])
                                    -(points[i][0]-points[k][0])*(points[i][1]-points[j][1]));
                        if(m>res)
                            res = m;
                    }
                }    
            }        
            return res;        
        }
    };
    
  • 相关阅读:
    NLTK学习笔记(三):NLTK的一些工具
    NLTK学习笔记(四):自然语言处理的一些算法研究
    NLTK学习笔记(五):分类和标注词汇
    深入C++的运算符重载
    python3实现TCP协议的简单服务器和客户端
    python3实现UDP协议的简单服务器和客户端
    Windows平台下python2和3的兼容问题解决
    异常处理
    内置方法
    反射:hasattr、getattr、setattr、delattr
  • 原文地址:https://www.cnblogs.com/xuyy-isee/p/11302889.html
Copyright © 2011-2022 走看看