一. 题目
-
问题
给你一个整数数组 nums 。
如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
返回好数对的数目。 -
示例
二. 方法一
-
解题思路
-
解题代码
def numIdenticalPairs(self, nums: List[int]) -> int:
count = 0
for i in range(0, len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] == nums[j]:
count += 1
return count
- 分析
时间复杂度: O(n^2)
空间复杂度: O(1)
三. 方法二: 高斯求和
-
解题思路
- 先对列表进行排序
- 再计算出每组数字的个数
- 高斯求和
-
解题代码
def numIdenticalPairs(self, nums: List[int]) -> int: nums.sort() count = 0 num = 1 for i in range(0, len(nums) - 1): if nums[i] == nums[i + 1]: num += 1 else: if num != 1: count += num * (num - 1) / 2 num = 1 if num != 1: count += num * (num - 1) / 2 return int(count)
-
分析
时间复杂度: O(nlogn)
空间复杂度: O(1)
四. 方法三:(方法二的优化, 用map存储)
-
解题思路
- 用map存储相同元素的数量(key为元素, value为数量)
- 再使用高斯求和计算最终的结果
-
解题代码
def numIdenticalPairs(self, nums: List[int]) -> int: map = {} count = 0 for ele in nums: if ele not in map.keys(): map[ele] = 1 else: map[ele] += 1 for key in map.keys(): if map[key] >= 2: count += map[key] * (map[key] - 1) // 2 return count