标题:812最大三角形面积-简单
题目
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
注意
- 3 <= points.length <= 50.
- 不存在重复的点。
- -50 <= points[i][j] <= 50.
- 结果误差值在 10^-6 以内都认为是正确答案。
代码Go
package main
import (
"fmt"
"math"
)
func main() {
points := [][]int{{0, 0}, {1, 0}, {0, 1}, {0, 2}, {2, 0}}
ans := largestTriangleArea(points)
fmt.Printf("ans: %v\n", ans)
}
func largestTriangleArea(points [][]int) float64 {
var ans float64 = 0.0
FindTriangle(points, 0, 0, &ans)
return ans
}
var triangle [][]int = make([][]int, 0)
// 排列组合-递归-回溯
func FindTriangle(points [][]int, lever int, depth int, ans *float64) {
if depth == 3 {
tempAns := TriangleArea(triangle)
if *ans < tempAns {
*ans = tempAns
}
fmt.Printf("triangle: %v\n", triangle)
return
}
for i := lever; i < len(points); i++ {
triangle = append(triangle, points[i])
FindTriangle(points, i+1, depth+1, ans)
triangle = triangle[:len(triangle)-1]
}
}
// 计算三个点组成的三角形面积
func TriangleArea(pointThree [][]int) float64 {
res := 0.0
x1 := pointThree[0][0]
y1 := pointThree[0][1]
x2 := pointThree[1][0]
y2 := pointThree[1][1]
x3 := pointThree[2][0]
y3 := pointThree[2][1]
a := math.Sqrt(float64((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)))
b := math.Sqrt(float64((x1-x3)*(x1-x3) + (y1-y3)*(y1-y3)))
c := math.Sqrt(float64((x2-x3)*(x2-x3) + (y2-y3)*(y2-y3)))
p := (a + b + c) / 2
res = math.Sqrt(p * (p - a) * (p - b) * (p - c))
return math.Abs(res)
}