447. Number of Boomerangs
Decription
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]]
Solution
- 题意即给定一个二元组数组,问有多少个三元组满足,三元组内容由给定数组中的二元组组成并且满足第一个元素和第二、三元素的欧氏距离相同。
- 我们可以利用哈希表,先统计其余元素和i控制的元素的距离,然后根据组合(假设与i元素的距离相同的有k个(k >= 2),那么从中选出2个数进行组合,即(n - 1) * n / 2)。代码如下:
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int rnt = 0;
for (int i = 0;i < points.size();i++) {
unordered_map<long,int> dis(points.size());
for (int j = 0;j < points.size();j++) {
if (i == j) continue;
int dx = points[i].first - points[j].first;
int dy = points[i].second - points[j].second;
dis[dx * dx + dy * dy]++;
}
for (auto&i : dis) {
if (i.second > 1) {
rnt += i.second * (i.second - 1);
}
}
}
return rnt;
}
};