zoukankan      html  css  js  c++  java
  • [刷题] 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
  • 相关阅读:
    linux内核中GNU C和标准C的区别
    linux内核中GNU C和标准C的区别
    Getting start with dbus in systemd (02)
    Getting start with dbus in systemd (01)
    Getting start with dbus in systemd (03)
    物理内存相关的三个数据结构
    数据类型对应字节数(32位,64位 int 占字节数)
    Linux kernel 内存
    共模电感的原理以及使用情况
    [原创]DC-DC输出端加电压会烧毁
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12618936.html
Copyright © 2011-2022 走看看