Description
Example
Solution 1(C++)
算法分析
这个题比较烦的一点就在这,最简单最直接就能想到的自然是暴力算法。获得每一个点与其他点的距离,如果发现有一对距离都一样,那么,boom+2。
大多数答案都是直接暴力解决。所以这里就很头铁。但还是要学一学如果快速码出整洁有效的代码。
程序分析
程序的关键就是如何简单的计算两个点之间的距离,并将其与其他距离比较。
第一个关键,答案利用了一个std函数:std::hypot。就是计算两个数的平方和的平方根。那么这里稍加改变,就可以得出两个点之间的计算代码了:
hypot(p.first - q.first, p.second - q.second);
第二个关键就是利用map容器,来实现判断有多少相等的距离。
unordered_map<double, int> ctr(points.size());
...
ctr[hypot(p.first - q.first, p.second - q.second)]++;
当有相同的距离出现时,就可以构成一个boomerang,那么,利用map容器的特性,让距离作为键,重复出现的次数作为值。就完成了有多少相等的距离了。
最后,一个boomerang可以有两个boom,所以就有:
booms += 2 * ctr[hypot(p.first - q.first, p.second - q.second)]++;
本文介绍了一种高效计算二维平面上点对间距离并找出构成Boomerang的算法。通过使用C++标准库函数std::hypot计算两点间距离,并利用unordered_map容器记录相同距离出现的次数,从而找出所有Boomerang。此方法避免了暴力求解的低效。

1万+

被折叠的 条评论
为什么被折叠?



