447. 回旋镖的数量

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

找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。

示例:

输入:
[[0,0],[1,0],[2,0]]

输出:
2

解释:
两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-boomerangs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

25 / 32 个通过测试用例

 tle

class Solution:
    def numberOfBoomerangs(self, points: List[List[int]]) -> int:
        if len(points)<3:return 0
        def dis(p,q):
            return (p[0]-q[0])**2+(p[1]-q[1])**2
        def check(i,j,k):
            return dis(i,j)==dis(i,k)
        def permute(nums):
            return itertools.permutations(nums,3)
        a=permute(points)
        res=0
        for i in a:
            if check(i[0],i[1],i[2]):
                res+=1
        return res
 
ac
class Solution:
    def numberOfBoomerangs(self, points: List[List[int]]) -> int:
        res=0
        for i in points:
            dis={}
            for j in points:
                if i!=j:
                    d=(i[0]-j[0])**2+(i[1]-j[1])**2
                    if d in dis:
                        dis[d]+=1
                    else:
                        dis[d]=1
            for k in dis.values():
                if k>0:
                    res+=k**2-k
        return res

 

带佬操作

class Solution{
public:
    int numberOfBoomerangs(vector<pair<int, int>>& points) {
        int booms = 0;
        for (auto &p : points) {
            unordered_map<double, int> ctr(points.size());
            for (auto &q : points)
                booms += 2 * ctr[hypot(p.first - q.first, p.second - q.second)]++;//Every time we add a "boomerang" point that can make up the same distance, we actually have to add 2 * the current number of "boomerang" tuples at the same distance point (that is, after the point to each point at the same distance , Change the position again, so * 2)
        }
        return booms;
    }
};

 

 

posted @ 2020-11-19 23:14  XXXSANS  阅读(102)  评论(0编辑  收藏  举报