[LeetCode]447.Number of Boomerangs

来源:互联网 发布:设置数据的有效范围 编辑:程序博客网 时间:2024/05/22 11:57

题目大意:点击打开链接

思路:如果有点a,还有另外两个点b和c,如果ab和bc之间的距离相等,有两种排列方法:abc,acb

           如果有点a,还有另外三个点b,c和d,如果三个点都和a之间的距离相等,有六种排列方法:abc,acb,acd,adc,abd,adb

           如果有n个点与a点之间的距离相等,那么排列方式为n*(n-1)

           所以问题就成了遍历所有点,让每个点都做一次a,然后遍历其他所有点,统计和a距离相等的点的个数

注意:对二维数组的理解,有n行,每一行的长度是2,分别代表该点的横纵坐标

           例如:points[i]表示每一行,例如points[i]=a,则a[0]表示这个点的横纵表,a[1]表示这个点的纵坐标

public class Solution {    public int numberOfBoomerangs(int[][] points) {        int result=0;        if(points==null || points.length==0){            return 0;        }                Map<Integer,Integer> map=new HashMap<>();        for(int i=0;i<points.length;i++){            for(int j=0;j<points.length;j++){                if(i==j){                    continue;                }                int dis=getDistance(points[i],points[j]);                map.put(dis,map.getOrDefault(dis,0)+1);            }                        for(Integer key:map.keySet()){                  //对于每一个i行的值,都有其他不同的距离相同的点组成的map                int sum=map.get(key);                result+=sum*(sum-1);            }            map.clear();                                    //因此遍历一个新的i时,要清空map        }        return result;    }        private int getDistance(int[] a,int[] b){               //两点间距离计算:(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)        int dx=a[0]-b[0];        int dy=a[1]-b[1];        return dx*dx+dy*dy;    }}
原创粉丝点击