要求
- 给出平面上n个点,寻找存在多少点构成的三元组(i j k),使得 i j 两点的距离等于 i k 两点的距离
- n 最多为500,所有点坐标范围在[-10000, 10000]之间
示例
- [[0,0],[1,0],[2,0]]
- 2
思路
- 对于每个点i,遍历其余点到i的距离(时间n2,空间n)
- 查找表记录其他点到 i 的<距离,频次>
- 对于每个距离,满足条件的三元组个数为:频次 x (频次-1)
- 求距离时用平方,防止浮点数误差
- 最长距离,2000^2+2000^2,32位整型不越界
实现
- 用pair存储点坐标
1 #include <iostream> 2 #include <vector> 3 #include <unordered_map> 4 #include <cassert> 5 #include <stdexcept> 6 #include <typeinfo> 7 8 using namespace std; 9 10 /// Using Hash Map 11 /// Time Complexity: O(n^2) 12 /// Space Complexity: O(n) 13 class Solution { 14 public: 15 int numberOfBoomerangs(vector<pair<int, int>>& points) { 16 17 int res = 0; 18 for( int i = 0 ; i < points.size() ; i ++ ){ 19 20 // record中存储 点i 到所有其他点的距离出现的频次 21 unordered_map<int, int> record; 22 for(int j = 0 ; j < points.size() ; j ++) 23 if(j != i) 24 // 计算距离时不进行开根运算, 以保证精度 25 record[dis(points[i], points[j])] += 1; 26 27 for(unordered_map<int, int>::iterator iter = record.begin() ; iter != record.end() ; iter ++) 28 res += (iter->second) * (iter->second - 1); 29 } 30 return res; 31 } 32 33 private: 34 int dis(const pair<int,int> &pa, const pair<int,int> &pb){ 35 return (pa.first - pb.first) * (pa.first - pb.first) + 36 (pa.second - pb.second) * (pa.second - pb.second); 37 } 38 }; 39 40 41 int main() { 42 //int a = 1; 43 vector<pair<int,int>> vec; 44 vec.push_back(make_pair(0, 0)); 45 vec.push_back(make_pair(1, 0)); 46 vec.push_back(make_pair(2, 0)); 47 48 cout << Solution().numberOfBoomerangs(vec) << endl; 49 return 0; 50 }
- 用vector存储点坐标
1 #include <iostream> 2 #include <vector> 3 #include <unordered_map> 4 #include <cassert> 5 #include <stdexcept> 6 #include <typeinfo> 7 8 using namespace std; 9 10 /// Using Hash Map 11 /// Time Complexity: O(n^2) 12 /// Space Complexity: O(n) 13 class Solution { 14 public: 15 int numberOfBoomerangs(vector<vector<int>>& points) { 16 17 int res = 0; 18 for( int i = 0 ; i < points.size() ; i ++ ){ 19 20 // record中存储 点i 到所有其他点的距离出现的频次 21 unordered_map<int, int> record; 22 for(int j = 0 ; j < points.size() ; j ++) 23 if(j != i) 24 // 计算距离时不进行开根运算, 以保证精度 25 record[dis(points[i], points[j])] += 1; 26 27 for(unordered_map<int, int>::iterator iter = record.begin() ; iter != record.end() ; iter ++) 28 res += (iter->second) * (iter->second - 1); 29 } 30 return res; 31 } 32 33 private: 34 int dis(const vector<int> &pa, const vector<int> &pb){ 35 return (pa[0] - pb[0]) * (pa[0] - pb[0]) + 36 (pa[1] - pb[1]) * (pa[1] - pb[1]); 37 } 38 }; 39 40 int main() { 41 vector<vector<int>> vec; 42 vector<int> vn; 43 44 vn.push_back(0); 45 vn.push_back(0); 46 vec.push_back(vn); 47 vn.clear(); 48 49 vn.push_back(1); 50 vn.push_back(0); 51 vec.push_back(vn); 52 vn.clear(); 53 54 vn.push_back(2); 55 vn.push_back(0); 56 vec.push_back(vn); 57 vn.clear(); 58 59 cout << Solution().numberOfBoomerangs(vec) << endl; 60 return 0; 61 }
相关
- 149 Max Points on a Line