[M哈希表] lc447. 回旋镖的数量(哈希表+计数)

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M哈希表] lc447. 回旋镖的数量(哈希表+计数)相关的知识,希望对你有一定的参考价值。

1. 题目来源

链接:447. 回旋镖的数量

2. 题目解析

比较简单的一个题,重点看看数据范围就行了,数据范围小,可以暴力求解。

枚举每个点作为点 i 的情况,可将 i 视为 V 型的底部点,j、k 视为上面两个点。那么针对点 i 可以求出所有点到 i 点的距离,用哈希表维护 [dist, cnt],其它点到 i 的距离:dist,相同 dist 点的个数 cnt。那么针对每个 dist,假设有 m 个点距离都是 dist,说明这 m 个点到 i 的距离都相等,则 i 就作为底部点,m 各点其中任选两个,且有顺序,作为顶部两个点即可。

有顺序的选择是排列问题,即 A m 2 = m ∗ ( m − 1 ) A_m^2=m*(m-1) Am2=m(m1)。也可将其想成组合,然后可以位置颠倒,得乘个 2 ,然后分母的 2 就没了。


  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    int numberOfBoomerangs(vector<vector<int>>& points) {
        int n = points.size();
        vector<unordered_map<int, int>> cnt(n);           // 每个点,[其余各点到它的距离,点的个数]
        for (int i = 0; i < points.size(); i ++ ) {
            for (int j = 0; j < points.size(); j ++ ) {
                if (i == j) continue;
                int x1 = points[i][0], y1 = points[i][1];
                int x2 = points[j][0], y2 = points[j][1];
                int dist = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
                cnt[i][dist] ++ ;
            }
        }

        int res = 0;
        for (int i = 0; i < n; i ++ ) 
            for (auto [k, v] : cnt[i]) 
                    res += (v - 1) * v;

        return res;
    }
};

go 代码

func numberOfBoomerangs(points [][]int) int {
    res := 0
    for _, p := range points {
        mp := map[int]int{}
        for _, q := range points {
            dist := (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1])
            mp[dist] ++ 
        }

        for _, m := range mp {
            res += m * (m - 1)
        }
    }

    return res
}

改下返回参数,就不用写返回值了:

func numberOfBoomerangs(points [][]int) (res int) {
    for _, p := range points {
        mp := map[int]int{}
        for _, q := range points {
            dist := (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1])
            mp[dist] ++ 
        }

        for _, m := range mp {
            res += m * (m - 1)
        }
    }

    return 
}

以上是关于[M哈希表] lc447. 回旋镖的数量(哈希表+计数)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—447. 回旋镖的数量( 哈希表)—day37

Leetcode刷题100天—447. 回旋镖的数量( 哈希表)—day37

哈希表的应用--回旋镖的数量

leetcode中等447回旋镖的数量

447-回旋镖的数量

LeetCode 447 回旋镖的数量[Map] HERODING的LeetCode之路