给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
示例 1:
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2:
输入:points = [[1,1],[2,2],[3,3]]
输出:2
示例 3:
输入:points = [[1,1]]
输出:0
提示:
n == points.length
1 <= n <= 500
points[i].length == 2
-104^44 <= xi, yi <= 104^44
所有点都 互不相同
遍历回旋镖的中点,然后看有多少个点到中点的距离相等:
cpp
class Solution {
public:
int numberOfBoomerangs(vector<vector<int>>& points) {
unordered_map<int, int> cnt;
int ans = 0;
for (vector<int> &pointi : points) {
cnt.clear();
for (vector<int> &pointjk : points) {
int distance = (pointi[0] - pointjk[0]) * (pointi[0] - pointjk[0]) +
(pointi[1] - pointjk[1]) * (pointi[1] - pointjk[1]);
if (cnt.find(distance) != cnt.end()) {
ans += cnt[distance];
}
++cnt[distance];
}
}
return ans * 2;
}
};
如果有n个点,则此算法时间复杂度为O(n2^22),空间复杂度为O(n)。