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;
    }
}
原文地址:https://www.cnblogs.com/zyoung/p/6892159.html