447. Number of Boomerangs
原题链接
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]]
题目大意:
给定平面上成对不同的n个点,“回旋镖”是点(i,j,k)的元组,使得i和j之间的距离等于i和k之间的距离(元组的顺序事项)。
找到回旋镖的数量。 您可以假设n最多为500,点的坐标全部在[-10000,10000](含)范围内。
思路:
这道题刚开始想了好久,想不到好方法,就参考了点击查看,暴力解法。
依次遍历数组中的点,找到其他所有的点与它的距离,记录在Hash表中对应的位置,如果有两个点到这个点距离相等, 那么有2个答案,如果有5个点到这个点距离相等, 那么会是这5个点的中有序取2个点的组合, 也就是一个排列组合的简单问题.
代码如下:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int res = 0;
unordered_map <double, int> Hash;
for(pair<int, int> p1 : points){
Hash.clear();
for(pair<int, int> p2 : points){
if (p1 == p2)
continue;
//hypot(a, b) 求直角三角形斜边长函数(a, b为直角三角形的直角边) #include <math.h>
Hash[hypot(p1.first-p2.first, p1.second-p2.second)]++;
}
for(auto val : Hash){
if(val.second > 1)
//val.second==5 (4+3+2+1)*2 -> (4+1) * [(5-1)/2] * 2 -> 5*(5-1) <==> val.second*(val.second-1)
res += val.second*(val.second-1);
}
}
return res;
}