1、描述
给定平面上 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
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
回旋镖,距离相等。
3、思路
距离相等,的两段算有效,排列不同就算两个,这符合排列问题,m * (m - 1)
两层暴力统计,把当前点作为折线的拐点,遍历其他点,把距离的平方出现的次数统计到一个hash_map中,然后根据个数使用m * (m - 1),把结果统计进去。
统计距离的平方。
4、notes
1、看到距离就想到只计算平方吧,
2、位置不同算不同就是排列的计算方式,m * (m - 1) 排列问题:有顺序要求
3、统计出现的次数:就用hash_map
4、for语句遍历整个pair时,可以使用中括号来标识。
for(auto &[_,m] : mp){
res += m * (m - 1);
}
5、复杂度
时间:O(n平方)
空间:O(N)
6、code
class Solution {
public:
int numberOfBoomerangs(vector<vector<int>>& points) {
int res = 0;
unordered_map<int,int>mp; // 统计当前节点为拐点,到其他点 距离出现的次数,
for(auto &p : points){
mp.clear(); // 换一次拐点就更新一次hash_map,
for(auto & q : points){
int dis = (p[0] - q[0]) *(p[0] - q [0]) +(p[1] - q[1]) * (p[1] - q[1]); // 计算距离,
mp[dis]++; // 统计 + 1
}
for(auto &[_,m] : mp){ // 遍历hash_map的距离出现的次数。
res += m * (m - 1);
}
}
return res;
}
};