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]]
这道题的思路很简单,就是建立两层循环,从下标0到size,遍历第一层时,设置一个map,记录其他pair距离该pair的距离,如果距离该点相同距离的点数num >= 2,那么就是用数学中的组合数:先从num中取出一个数,然后从num - 1中再取一个数,那么以该点boomerang第一个元素的boomerangs有num*(num - 1)个。接着,再一次遍历其他pair。
代码:
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int size = points.size();
int result = 0;
if(size < 3)
return 0;
for(int i = 0; i < size; i ++){
map<int, int> myMap;
for(int j = 0; j < size; j ++){
if(i != j){
myMap[dist(points[i], points[j])] ++;
}
}
for(auto it = myMap.begin(); it != myMap.end(); it ++){
if((it -> second) >= 2)
result += (it -> second) * ((it -> second) - 1);
}
}
return result;
}
int dist(pair<int, int> &a,pair<int, int> &b){
int x=(a.first-b.first)*(a.first-b.first);
int y=(a.second-b.second)*(a.second-b.second);
return x+y;
}
};
其实,把这道题写出来,主要目的是让自己记住两个东西:
1. 定义map时,如果map的value类型为int,那么该map的value缺省值默认为0,解释为int为非类类型,例如:
map<char, int> map1;
cout << map['a'];//输出0
- 题目中[0,0]这种组合怎么表示,使用
vector<pair<int, int>> points
取出其中的每个元素的第一个值和第二个值的方式:
points[1].first, points[1].second
好了,要说的就这么多!