LeetCodeAnimation/notes/LeetCode第447号问题:回旋镖的数量.md
程序员吴师兄 5dee53d957 更换图片地址
2019-11-14 11:00:28 +08:00

99 lines
3.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LeetCode第447号问题回旋镖的数量
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
题目来源于 LeetCode 上第 447 号问题回旋镖的数量题目难度为 Easy目前通过率为 45.8%
### 题目描述
给定平面上 *n* 对不同的点回旋镖 是由点表示的元组 `(i, j, k)` 其中 `i` `j` 之间的距离和 `i` `k` 之间的距离相等**需要考虑元组的顺序**
找到所有回旋镖的数量你可以假设 *n* 最大为 **500**所有点的坐标在闭区间 **[-10000, 10000]**
**示例:**
```
输入:
[[0,0],[1,0],[2,0]]
输出:
2
解释:
两个回旋镖为 [[1,0],[0,0],[2,0]] [[1,0],[2,0],[0,0]]
```
### 题目解析
n 最大为 500可以使用时间复杂度为 O(n^2)的算法
- 遍历所有的点让每个点作为一个锚点
- 然后再遍历其他的点统计和锚点距离相等的点有多少个
- 然后分别带入 n(n-1) 计算结果并累加到res中
##### Tips
###### Tip1
- 如果有一个点 a还有两个点 b c 如果 ab ac 之间的距离相等那么就有两种排列方法 abc acb
- 如果有三个点 bcd都分别和a之间的距离相等那么有六种排列方法abc, acb, acd, adc, abd, adb
- 如果有 n 个点和点 a 距离相等那么排列方式为 n(n-1)
###### Tip2
- 计算距离时不进行开根运算, 以保证精度
- 只有当n大于等于2时res值才会真正增加因为当n=1时增加量为`1*(1-1)=0`
### 动画描述
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/0ys9o.gif)
### 代码实现
```
// 447. Number of Boomerangs
// https://leetcode.com/problems/number-of-boomerangs/description/
// 时间复杂度: O(n^2)
// 空间复杂度: O(n)
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int res = 0;
for( int i = 0 ; i < points.size() ; i ++ ){
// record中存储 点i 到所有其他点的距离出现的频次
unordered_map<int, int> record;
for(int j = 0 ; j < points.size() ; j ++){
if(j != i){
// 计算距离时不进行开根运算, 以保证精度
record[dis(points[i], points[j])] += 1;
}
}
for(unordered_map<int, int>::iterator iter = record.begin() ; iter != record.end() ; iter ++){
res += (iter->second) * (iter->second - 1);
}
}
return res;
}
private:
int dis(const pair<int,int> &pa, const pair<int,int> &pb){
return (pa.first - pb.first) * (pa.first - pb.first) +
(pa.second - pb.second) * (pa.second - pb.second);
}
};
```
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/s95kv.png)