高薪算法+计算机职称考试LeetCodeSwift in LeetCode

LeetCode 812. 最大三角形面积 Largest Tr

2019-08-19  本文已影响0人  1江春水

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

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

【注意】

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

【思路】
1、穷举所有点,使用另外一种求解三角形面积的定理:海伦公式
2、 海伦公式
3、sqrt(p*(p-a)(p-b)(p-c)),其中p=(a+b+c)/2

代码实现:

func largestTriangleArea(_ points: [[Int]]) -> Double {
    var res = Double()
    for i in 0..<points.count-2 {
        for j in i+1..<points.count-1 {
            for k in j+1..<points.count {
                let tmp = area(points[i], points[j], points[k])
                res = max(res, tmp)
            }
        }
    }
    return res
}

func area(_ x:[Int],_ y:[Int],_ z:[Int]) -> Double {
    var a : Double = 0.0,b = 0.0,c = 0.0,p = 0.0
    let xa = (x[0]-y[0])*(x[0]-y[0])
    let ya = (x[1]-y[1])*(x[1]-y[1])
    a = sqrt(Double(xa + ya))
    
    let xb = (x[0]-z[0])*(x[0]-z[0])
    let yb = (x[1]-z[1])*(x[1]-z[1])
    b = sqrt(Double(xb + yb))
    
    let xc = (y[0]-z[0])*(y[0]-z[0])
    let yc = (y[1]-z[1])*(y[1]-z[1])
    c = sqrt(Double(xc+yc))
    
    p = (a+b+c)/2
    let res = p*(p-a)*(p-b)*(p-c)
    return sqrt(res)//海伦公式
}
上一篇 下一篇

猜你喜欢

热点阅读