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

Posted C_YCBX Py_YYDS

tags:

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


题目


OJ平台

题目解析

基本思路:

  1. 任意两个点的距离,用二维数组存储。

  2. 根据每次外层循环选中的序号构建关于该序号的回旋镖,用哈希表存储到达该点的距离次数。注意每轮重新清空哈希表。

  3. 根据An2求出每轮的答案相加即可。

可用于把第一步优化掉,直接用两层循环记录任意两点的距离,哈希表直接存值即可。

代码实现

我的实现–二维数组+哈希表+An2

class Solution {
public:
    int numberOfBoomerangs(vector<vector<int>>& points) {
    int ans=0,size=points.size(),dist[size][size];
    memset(dist,0,sizeof(dist));
    unordered_map<int, int> check;
    for (int i = 0; i < size; ++i){//j=i+1避免重复计算
        for (int j = i+1; j < size; ++j){
            int dx = points[i][0] - points[j][0];
            int dy = points[i][1] - points[j][1];
            dist[i][j] = dist[j][i] = dx*dx + dy*dy;
        }
        for (int k = 0; k < size; ++k){
            ++check[dist[i][k]];//统计到i距离相同的点
        }
        for (auto c : check){//A2排列数
            ans += c.second * (c.second-1);
        }
        check.clear();
    }
    return ans;
}
};

官方实现–哈希表+An2

class Solution {
public:
    int numberOfBoomerangs(vector<vector<int>> &points) {
        int ans = 0;
        unordered_map<int, int> cnt;
        for (auto &&p : points) {
            for (auto &&q : points) {
                int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);
                ++cnt[dis];
            }
            for (auto &[_, m] : cnt) {
                ans += m * (m - 1);
            }
            cnt.clear();
        }
        return ans;
    }
};

以上是关于哈希表的应用--回旋镖的数量的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

447-回旋镖的数量

447. 回旋镖的数量

《LeetCode之每日一题》:148.回旋镖的数量