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;
    }
};

 

posted on 2021-09-13 16:16  Yxter  阅读(27)  评论(0编辑  收藏  举报

导航