Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i, j, k)
such that the distance between i
and j
equals the distance between i
and k
(the order of the tuple matters).
Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000](inclusive).
Example:
Input: [[0,0],[1,0],[2,0]] Output: 2 Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
法1:每个点与其他点的距离作为array,排序后查找距离相同的元素的个数,可用二分查找,每有K个相同的元素,就有A(K,2)对满足要求的组合
public class Solution {
public static int numberOfBoomerangs(int[][] points)
{
int m=points.length;
if(m<1)
return 0;
int n=points[0].length;
int[][] dis=new int[m][m-1];
int ret=0;
for(int i=0;i<m;i++)
{
dis[i]=new int[m-1];
int cnt=0;
int x=points[i][0];
int y=points[i][1];
for(int j=0;j<m;j++)
{
int d=(points[j][0]-x)*(points[j][0]-x)+(points[j][1]-y)*(points[j][1]-y);
if(d>0)
dis[i][cnt++]=d;
}
Arrays.sort(dis[i]);
int k=0;
while(k<m-1)
{
int num=dis[i][k];
int lo=0,hi=m-2;
int mid=-1;
while(lo<hi)
{
mid=lo+(hi-lo)/2;
if(dis[i][mid]>num)
hi=mid-1;
else if(dis[i][mid]<num)
lo=mid+1;
else {
if(mid+1<=m-2&&dis[i][mid+1]==num)
lo=mid+1;
else {
break;
}
}
}
int next_index=(lo==hi?lo:mid)+1;
int len=next_index-k;
if(len>1)
ret+=(len*(len-1));
k=next_index;
}
}
return ret;
}
}
法2 : hash映射,和每个点距离相同的点映射到同一个key中
public int numberOfBoomerangs(int[][] points) {
int res = 0;
Map<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 d = getDistance(points[i], points[j]);
map.put(d, map.getOrDefault(d, 0) + 1);
}
for(int val : map.values()) {
res += val * (val-1);
}
map.clear();
}
return res;
}
private int getDistance(int[] a, int[] b) {
int dx = a[0] - b[0];
int dy = a[1] - b[1];
return dx*dx + dy*dy;
}