Leetcode 447.回旋镖的数量
回旋镖的数量
给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。
找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。
示例:
输入:
[[0,0],[1,0],[2,0]]
输出:
2
解释:
两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
思路:
将每个点作为第一个点进行遍历,并统计相同距离的点个数;
每个距离作为键,点个数作为值,故而采用哈希表的方式进行存储;
如果存在n个点与某一点的距离相等,则由排列组合可得n*(n-1)种排列方式,即存在n*(n-1)种回旋镖
1 import java.util.HashMap; 2 3 class Solution { 4 public static int numberOfBoomerangs(int[][] points) { 5 int len=points.length; 6 int res=0; 7 HashMap<Integer,Integer> hashMap=new HashMap<Integer,Integer>(); 8 for(int i=0;i<len;i++){ 9 for(int j=0;j<len;j++){ 10 if(i!=j){ 11 int x=points[i][0]-points[j][0]; 12 int y=points[i][1]-points[j][1]; 13 int dist=x*x+y*y; 14 if(hashMap.containsKey(dist)){ 15 hashMap.put(dist,hashMap.get(dist)+1); 16 }else{ 17 hashMap.put(dist,1); 18 } 19 } 20 } 21 for(Integer count:hashMap.values()){ 22 res+=count*(count-1); 23 } 24 hashMap.clear(); 25 } 26 return res; 27 } 28 }