• 447. 回旋镖的数量 力扣(中等) 枚举+哈希/sort


    447. 回旋镖的数量

    给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。

    返回平面上所有回旋镖的数量。

     
    示例 1:

    输入:points = [[0,0],[1,0],[2,0]]
    输出:2
    解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

    代码:可以优化,将sort用哈希代替,108ms

    class Solution {
    public: 
    
        int cal(int x1,int y1,int x2,int y2)
        {
            return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
        }
        int numberOfBoomerangs(vector<vector<int>>& points) {
            int dis[505][505];
            int n=points.size();
            for(int i=0;i<n;i++)
             for (int j=i;j<n;j++)
            {
                if (i==j) dis[i][j]=0;
                 else {
                     dis[i][j]=cal(points[i][0],points[i][1],points[j][0],points[j][1]);
                     dis[j][i]=dis[i][j];
                 }
            }
            int res=0;
            for(int i=0;i<n;i++)
            {
                sort(dis[i],dis[i]+n);
                int num=1;
                int j=1;
                while(j<n)
                {
                    if(dis[i][j]==dis[i][j-1]) {num++;j++;}
                      else{
                          res+=num*(num-1);
                          num=1;
                          j++;
                      }
                }
                res+=num*(num-1);
            }
        return res;
        }
    };

    改进写法,发现时间更久了448ms

    class Solution {
    public: 
    
        int cal(int x1,int y1,int x2,int y2)
        {
            return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
        }
        int numberOfBoomerangs(vector<vector<int>>& points) {
        
            int n=points.size();
            int res=0;
            for(int i=0;i<n;i++)
            {
                unordered_map<int,int> mp;
                for(int j=0;j<n;j++)
                {
                    if(i==j) continue;
                    int d=cal(points[i][0],points[i][1],points[j][0],points[j][1]);
                    mp[d]++;
                }
                for(auto j:mp)
                    res+=j.second*(j.second-1);
            }
        return res;
        }
    };
  • 相关阅读:
    01.html5+phonegap跨平台移动应用开发
    10个CSS简写/优化技巧
    JS高级学习历程-17
    JS高级学习历程-16
    算法详解之Tarjan
    分层图详解
    洛谷 题解 P1196 【[NOI2002]银河英雄传说】
    洛谷 题解 P1220 【关路灯 】
    洛谷 题解 P1352 【没有上司的舞会】
    二维前缀和详解
  • 原文地址:https://www.cnblogs.com/stepping/p/15262936.html
Copyright © 2020-2023  润新知