解题思路
Map
这里i的索引非常重要 ,可以理解为一个枢纽
对于每一个节点i,建立一个map
- 对于每一个节点i,扫描一遍所有的其他点,再计算一下其他点到i的距离
- 建立一个map,key保存到该点 距离的值,value为有多少个距离为key的点
- 比如到i距离为10的点有一个,则无法找到满足题意的三元组
- 距离为2的点有两个,说明有满足题意的三元组 ,选择方式有n*(n-1)种
- 第一次从n个数中选出一个放在j的位置上,第二次从n-1个数中选出一个放在k的位置上,因此为n*(n-1)
public int numberOfBoomerangs(int[][] points) {
int res = 0;
//遍历每一个节点i
for(int i=0;i<points.length;i++){
//map用来保存到i节点距离为key的点的数目value
Map<Integer,Integer> map = new HashMap<>();
//遍历其他的点
for(int j=0;j<points.length;j++){
//如果是其他的点
if(j!=i){
//计算其他的点到i节点的距离
int key = dis(points[i], points[j]);
//点的数目累加
map.put(key,map.getOrDefault(key, 0)+1);
}
}
//遍历map的结果集 如果到i节点的距离为x的距离的点超过2个 则计算其组合数并累加
for(int value:map.values()){
if(value>=2){
res += value*(value-1);
}
}
}
return res;
}
//计算两点之间距离的函数 这里为了避免开根号造成的损失 使用平方和
public int dis(int[] a,int[] b){
return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]);
}
//time O(n^2)
//space O(n) 因为每次循环利用的是一个map