题意:给若干个二维点,找出所有的点序列i, j, k使得i到另外两个点的距离相同。返回这样的序列的个数。
solution 0: 贪心算法。确定i,确定j,寻找k。一个极其复杂的三重循环。
solution 1. 遍历点集,用hash表存储当前节点到所有其他点的距离。此题的关键不在于当前点与哪些点有相同的距离,而在于对于某个特定的距离有几个点,因此指出要存储dist对应的count即可。快速根据dist更新count想到使用hash表。最后得到dist到count的hash表。根据题目的特点,n个相同距离的点安排在两个位置可以有An2种即n*(n-1)种序列组合。
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
// 每一个点都创建一个hash表来保存距离映射(key是距离 value是点的个数)
// 最后可以得出对于每个距离有几个点,这些距离对应的点的个数n,产生结果n*(n-1)。累加,得到最后的结果
int count = 0;
for ( int i = 0; i<points.size(); i++ ) {
unordered_map<long, int> dist_map(points.size());
for ( int j = 0; j < points.size(); j++ ) {
if ( i==j )
continue;
int dx = points[i].first-points[j].first;
int dy = points[i].second-points[j].second;
int sqr_dist = dx*dx + dy*dy;
dist_map[sqr_dist]++;
}
for ( auto& p : dist_map ) {
count += p.second * ( p.second-1 );
}
}
return count;
}
};
hash解提交结果: