leetcode/
number_of_good_pairs.rs

1//! # 1512. 好数对的数目
2//!
3//! 难度 简单
4//!
5//! 给你一个整数数组 `nums` 。
6//!
7//! 如果一组数字 `(i,j)` 满足 `nums[i] == nums[j]` 且 `i < j` ,就可以认为这是一组 **好数对** 。
8//!
9//! 返回好数对的数目。
10//!
11//!
12//! ## 示例 1:
13//!
14//! ```text
15//! 输入:nums = [1,2,3,1,1,3]
16//! 输出:4
17//! 解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
18//! ```
19//!
20//! ## 示例 2:
21//!
22//! ```text
23//! 输入:nums = [1,1,1,1]
24//! 输出:6
25//! 解释:数组中的每组数字都是好数对
26//! ```
27//!
28//! ## 示例 3:
29//!
30//! ```text
31//! 输入:nums = [1,2,3]
32//! 输出:0
33//! ```
34//!
35//!
36//! ## 提示:
37//!
38//! * `1 <= nums.length <= 100`
39//! * `1 <= nums[i] <= 100`
40//!
41//! See [leetcode](https://leetcode-cn.com/problems/number-of-good-pairs/)
42
43pub struct Solution;
44
45impl Solution {
46    pub fn num_identical_pairs(nums: Vec<i32>) -> i32 {
47        debug_assert!(nums.len() >= 1 && nums.len() <= 100);
48        nums.iter().fold(std::collections::HashMap::new(), |mut counts, &n| {
49            counts.entry(n).and_modify(|v| *v += 1).or_insert(1);
50            counts
51        })
52        .values()
53        .map(|v| v * (v - 1) / 2)
54        .sum()
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn test() {
64        let cases = vec![
65            (4, vec![1,2,3,1,1,3]),
66            (6, vec![1,1,1,1]),
67            (0, vec![1,2,3]),
68            (0, (1..=100).collect()),
69        ];
70
71        for (expect, input) in cases {
72            assert_eq!(expect, Solution::num_identical_pairs(input));
73        }
74    }
75}