好数对的数目
题目描述
给你一个整数数组 nums。
如果一组数字 (i, j) 满足 nums[i] == nums[j] 且 i < j,就可以认为这是一组 好数对。
返回 好数对 的数目。
示例
示例 1:
输入:nums = [1,2,3,1,1,3]
输出:4
解释:
有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5),下标从 0 开始。
示例 2:
输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对。
示例 3:
输入:nums = [1,2,3]
输出:0
思路与解法
这道题目要求我们找出满足 nums[i] == nums[j] 且 i < j 的所有数对。对于每个出现过的数,我们可以利用哈希表来统计它出现的次数,然后通过组合的方式计算好数对的数量。
假设某个数出现了 k 次,那么从中任选两个位置作为数对的数量就是 C(k, 2) = k * (k - 1) / 2。我们可以通过统计每个数的出现次数来逐步累加好数对的数量。
代码实现
python
复制
编辑
from collections import defaultdict
from typing import List
class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
res = 0
cnt = defaultdict(int)
# 遍历数组,统计每个数字出现的次数for x in nums:res += cnt[x]cnt[x] += 1return res
代码解释
哈希表 cnt:用于统计每个数字出现的次数。
累加好数对:每次遇到一个数字 x,我们增加 cnt[x],表示当前数字 x 之前已经出现了多少次。然后更新 cnt[x] 的次数。
返回结果:返回最终的好数对数量。
时间复杂度
时间复杂度为 O(n),其中 n 是数组 nums 的长度。我们遍历一次数组并进行常数时间的哈希操作。