LeetCode - 447. Number of Boomerangs
链接
题意
回旋镖之数。给定n个点(x和y坐标),找出这样的所有三点组合(i,j,k):i到j的距离等于i到k的距离。n至多等于500。
思路
遍历所有的点,因为点的顺序也有关系,所以j仍要从0开始。获得i和j的距离后存入map中,若当前距离已有value,则value++,否则value为0。全部遍历完成后,相当于有了一个所有可能的距离的点的集合。
代码
public class Solution {
public int numberOfBoomerangs(int[][] points){
int result = 0;
HashMap<Integer, Integer> map= new HashMap<>();
for(int i = 0; i < points.length; i++){
for(int j = 0; j < points.length; j++){
if(i == j) continue;
int distance = getDistance(points[i],points[j]);
map.put(distance, map.getOrDefault(distance,0)+1);
}
for(int val : map.values()){
result += val*(val-1); // 满足条件的点的排列结果数(val取2)
}
map.clear(); // 这步很关键,因为如果不清空map,则会存在AB点距离等于CD点距离的情况,四个点不符合题意
}
return result;
}
public int getDistance(int[] point1, int[] point2){
int x = point1[0] - point2[0];
int y = point1[1] - point2[1];
return x*x + y*y;
}
}