You are given n points in the plane that are all distinct, where points[i] = [xi, yi]. A boomerang is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters).
Return the number of boomerangs.
Example 1:
Input: points = [[0,0],[1,0],[2,0]]
Output: 2
Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]].
Example 2:
Input: points = [[1,1],[2,2],[3,3]]
Output: 2
Example 3:
Input: points = [[1,1]]
Output: 0
Constraints:
- n == points.length
- 1 <= n <= 500
- points[i].length == 2
- -104 <= xi, yi <= 104
- All the points are unique.
points 的长度最大 500 个, 我们可以算任意两点之间的距离而保证不会超时, 因为 boomeranges 是三个点的 tuple, 所以是任意一个 point 到另外两个同距离的 point 的组合, 我们把所有距离某一个 point 的具有相同距离的 point 的数量保存起来, 例如 counts[i][dist]=2, 代表与 points[i]距离为 dist 的 point 的数量是 2, 这样剩下的就是一个排列组合的问题了。(points[i], _, _), counts[i][dist]个 point 里面选一个 a 填充, 得到(points[i], a, _), 然后 counts[i][dist]-1 个点里面(因为前面已经选了 1 个了)里面选一个 b 填充, 得到(points[i], a, b), 总结起来其实就是一共有 counts[i][dist] * (counts[i][dist]-1)种组合
use std::collections::HashMap;
impl Solution {
pub fn number_of_boomerangs(points: Vec<Vec<i32>>) -> i32 {
let mut dists = vec![HashMap::new(); points.len()];
for i in 0..points.len() {
for j in 0..points.len() {
let dist =
(points[i][0] - points[j][0]).pow(2) + (points[i][1] - points[j][1]).pow(2);
*dists[i].entry(dist).or_insert(0) += 1;
}
}
let mut ans = 0;
for d in dists {
for &c in d.values() {
ans += c * (c - 1);
}
}
ans as i32
}
}