小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
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;
}
}