题目链接: https://leetcode.com/problems/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]]
思路: 以每一个点为tuple第一个点, 计算所有点到这个点距离, 到这个点距离相等的任意2点就可以和这个点构成这样的tuple, 并且如果有两个点到这个点距离相等, 那么有2个答案, 如果有5个点到这个点距离相等, 那么会是这5个点的中有序取2个点的组合, 也就是一个排列组合的简单问题. 所以思路就是用hash来计算保存所有其他点到一个点的距离, 然后再遍历hash表查看距离相等的点, 累加所有的组合即可.
代码如下:
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int ans = 0, len = points.size();
for(auto p1: points)
{
unordered_map<double, int> hash;
for(auto p2: points)
hash[hypot(p1.first-p2.first, p1.second-p2.second)]++;
for(auto val: hash)
if(val.second > 1) ans += val.second*(val.second-1);
}
return ans;
}
};