leetcode_rust/
number_of_boomerangs.rs

1#![allow(dead_code)]
2
3// Permutations: count = n * (n-1)
4pub fn number_of_boomerangs(points: Vec<Vec<i32>>) -> i32 {
5    use std::collections::HashMap;
6
7    let mut map = HashMap::new();
8    let mut count: i32 = 0;
9    for i in 0..points.len() {
10        for j in 0..points.len() {
11            if i == j {
12                continue;
13            }
14            let x_diff = points[i][0] - points[j][0];
15            let y_diff = points[i][1] - points[j][1];
16            let dis = x_diff * x_diff + y_diff * y_diff;
17            match map.get_mut(&dis) {
18                Some(v) => *v += 1,
19                None => {
20                    map.insert(dis, 1);
21                }
22            }
23        }
24        let sum: i32 = map.iter().map(|(_, &x)| x * (x - 1)).sum();
25        count += sum;
26        map.clear();
27    }
28
29    count
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test1() {
38        let points = vec![vec![0, 0], vec![1, 0], vec![2, 0]];
39        assert_eq!(number_of_boomerangs(points), 2);
40
41        let points = vec![vec![0, 0], vec![1, 0], vec![-1, 0], vec![0, 1], vec![0, -1]];
42        assert_eq!(number_of_boomerangs(points), 20);
43
44        let points = vec![vec![0, 0], vec![2, 1], vec![2, 0], vec![0, 1]];
45        assert_eq!(number_of_boomerangs(points), 0);
46    }
47}