[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∗(m−1)。也可将其想成组合,然后可以位置颠倒,得乘个 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