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}