leetcode447. 回旋镖的数量(枚举 hash存储)

链接:https://leetcode-cn.com/problems/number-of-boomerangs/

题目

给定平面上 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]]
示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:2
示例 3:

输入:points = [[1,1]]
输出:0

提示:

n == points.length
1 <= n <= 500
points[i].length == 2
-104 <= xi, yi <= 104
所有点都 互不相同

思路

暴力枚举每一个点道另一个点的距离,统计相同的距离数m
统计数量可以用hash存
又因为存在序列关系,所以是排序问题,相同距离数m存在的排序有(m-1)*m

代码

class Solution {
public:
    int numberOfBoomerangs(vector<vector<int>>& points) {
        int ans=0;
        for(auto &p :points)
        {
            unordered_map<int ,int>mp;//记录长度
            for(auto &q :points)
            {    //存平方数可以防止开平方带来的误差
                int dis=(p[0]-q[0])*(p[0]-q[0])+(p[1]-q[1])*(p[1]-q[1]);
                ++mp[dis];
            }
            
            for(auto &[_,m] :mp)
            {
                ans +=m*(m-1);
            }
        }
        return ans;
    }
};
posted @ 2021-09-13 09:56  kitamu  阅读(38)  评论(0)    收藏  举报
Live2D