[刷题] 447 Number of Boomerangs

要求

  • 给出平面上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 }
View Code
  • 用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 }
View Code

相关

  • 149 Max Points on a Line
原文地址:https://www.cnblogs.com/cxc1357/p/12618936.html