题目:
思路:
先确定一个点,然后找到所有到它的距离相等的点,当距离相等的点的数目为2时,有21种,当数目为3时,有32种,于是,如果有n个点,那么可以得到的回旋镖的数目为n*(n-1)。对每个点的判断方法都是一样的,把以所有点为第一个点所能得到的所有回旋镖数目累加,就是总数了。
保存到每个点有相同距离的点的数目的方式:
使用HashMap完成计数。
for(int j=0;j<points.length;j++){
int dis=(int)Math.pow(points[i][0]-points[j][0], 2)+(int)Math.pow(points[i][1]-points[j][1],2);
if(map.containsKey(dis)){
map.put(dis, map.get(dis)+1);
}else{
map.put(dis, 1);
}
}
统计结果:
迭代value值,累加回旋镖数。
Iterator<Integer> iterator=map.values().iterator();
while(iterator.hasNext()){
int v=iterator.next();
if(v>1){
count+=(v-1)*v;
}
}
完整代码(Java):
class Solution {
public int numberOfBoomerangs(int[][] points) {
if(points.length<3){
return 0;
}
int count=0;
for(int i=0;i<points.length;i++){
HashMap<Integer, Integer> map=new HashMap<>();
for(int j=0;j<points.length;j++){
int dis=(int)Math.pow(points[i][0]-points[j][0], 2)+(int)Math.pow(points[i][1]-points[j][1],2);
if(map.containsKey(dis)){
map.put(dis, map.get(dis)+1);
}else{
map.put(dis, 1);
}
}
Iterator<Integer> iterator=map.values().iterator();
while(iterator.hasNext()){
int v=iterator.next();
if(v>1){
count+=(v-1)*v;
}
}
}
return count;
}
}