447. 回旋镖的数量

97 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

447. 回旋镖的数量

给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。

返回平面上所有回旋镖的数量。

示例 1:

输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]][[1,0],[2,0],[0,0]]
示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:2
示例 3:

输入:points = [[1,1]]
输出:0

解题思路

使用枚举+哈希表的方法

对于每个点,我们计算出它与其他点的距离。对于到该点距离相同的点,我们加入到该距离对应的list中,该list中的任意两个点都可以与该点形成回旋镖,通过对list中的所有点利用公式计算组合个数,我们可以计算出以当前点为顶点时可以形成的回旋镖的个数

代码

class Solution {
    public int numberOfBoomerangs(int[][] points) {

        int n=points.length;
        Map<Integer,List<Integer>>[] map=new HashMap[n];
        for(int i=0;i<n;i++)
            map[i]=new HashMap<>();
         for(int i=0;i<n;i++)
             for(int j=i+1;j<n;j++)
             {
                 int x1=points[i][0],y1=points[i][1],x2=points[j][0],y2=points[j][1];
                 int d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
                 if(!map[i].containsKey(d))
                     map[i].put(d,new ArrayList<>());
                 if(!map[j].containsKey(d))
                     map[j].put(d,new ArrayList<>());
                 map[i].get(d).add(j);
                 map[j].get(d).add(i);
             }
        int res=0;
        for(int i=0;i<n;i++){
            
            for(List l:map[i].values())
            {
                if(l.size()>=2)
                    res+=l.size()*(l.size()-1);
            }
        }
        return res;
            
    }
}