原题如下:
https://leetcode-cn.com/problems/largest-triangle-area/
题解
思路一
海伦公式:
回溯法遍历:
/*
*@v7fgg
*执行用时 :13 ms, 在所有 Java 提交中击败了14.08%的用户
*内存消耗 :37.6 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月15日 15:22
*/
class Solution {
double ans=0;
public double largestTriangleArea(int[][] points) {
mianji(0,points,new ArrayList<>());
return ans;
}
public void mianji(int kaishi,int[][] points,ArrayList<int[]> list){
if(list.size()==3){
double a=Math.sqrt(Math.pow(list.get(0)[0]-list.get(1)[0],2)+Math.pow(list.get(0)[1]-list.get(1)[1],2));
double b=Math.sqrt(Math.pow(list.get(0)[0]-list.get(2)[0],2)+Math.pow(list.get(0)[1]-list.get(2)[1],2));
double c=Math.sqrt(Math.pow(list.get(2)[0]-list.get(1)[0],2)+Math.pow(list.get(2)[1]-list.get(1)[1],2));
//注意绝对值
double S=Math.sqrt(Math.abs((a+b+c)*(a+b-c)*(b+c-a)*(a+c-b)))/4;
ans=Math.max(ans,S);
return;
}
for(int i=kaishi;i<points.length;i++){
list.add(points[i]);
mianji(i+1,points,list);
list.remove(list.size()-1);
}
}
}
普通遍历:
/*
*@v7fgg
*执行用时 :15 ms, 在所有 Java 提交中击败了14.73%的用户
*内存消耗 :37.5 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月15日 15:31
*/
class Solution {
public double largestTriangleArea(int[][] points) {
double ans=0;
for(int i=0;i<points.length-2;i++){
for(int j=i+1;j<points.length-1;j++){
double a=Math.sqrt(Math.pow(points[i][0]-points[j][0],2)+Math.pow(points[i][1]-points[j][1],2));
for(int k=j+1;k<points.length;k++){
double b=Math.sqrt(Math.pow(points[i][0]-points[k][0],2)+Math.pow(points[i][1]-points[k][1],2));
double c=Math.sqrt(Math.pow(points[k][0]-points[j][0],2)+Math.pow(points[k][1]-points[j][1],2));
ans=Math.max(ans,Math.sqrt(Math.abs((a+b+c)*(a+b-c)*(b+c-a)*(a+c-b)))/4);
}
}
}return ans;
}
}
思路二
/*
*@v7fgg
*执行用时 :12 ms, 在所有 Java 提交中击败了18.18%的用户
*内存消耗 :37.3 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月15日 20:10
*/
class Solution {
public double largestTriangleArea(int[][] points) {
double ans=0;
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++){
//S/2.0
ans=Math.max(ans,Math.abs(points[i][0]*points[j][1]+points[j][0]*points[k][1]+points[k][0]*points[i][1]-points[i][1]*points[j][0]-points[j][1]*points[k][0]-points[k][1]*points[i][0])/2.0);
}
}
}return ans;
}
}
思路三
叉积取模:
/*
*@v7fgg
*执行用时 :7 ms, 在所有 Java 提交中击败了43.11%的用户
*内存消耗 :37.4 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月15日 20:23
*/
class Solution {
public double largestTriangleArea(int[][] points) {
double ans=0;
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++){
ans=Math.max(ans,Math.abs(((points[j][0]-points[i][0])*(points[k][1]-points[j][1]))-((points[j][1]-points[i][1])*(points[k][0]-points[j][0])))/2.0);
}
}
}return ans;
}
}