题目:

思路:
先确定一个点,然后找到所有到它的距离相等的点,当距离相等的点的数目为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;
}
}
回旋镖算法解析
本文深入探讨了回旋镖算法的实现细节,介绍了如何利用Java的HashMap来统计平面上点构成回旋镖的数量,通过计算任意两点之间的距离,并对相等距离的点进行计数,最终得出所有可能的回旋镖组合。
&spm=1001.2101.3001.5002&articleId=87877386&d=1&t=3&u=528a50265a18433288af9da22d941b34)
619

被折叠的 条评论
为什么被折叠?



