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