LeetCode 1512. 好数对的数目
给你一个整数数组 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
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
思路1:暴力
用双指针,将后方指针固定,前方指针前移,双循环遍历数组
复杂度:O(n^2)
func numIdenticalPairs(nums []int) int {
i:=0
j:=len(nums)-1
sum:=0
for j>0 {
if nums[i]==nums[j] {
sum++
}
if i==j-1 {
i=0
j--
continue
}
i++
}
return sum
}
思路2:字典计数
使用Map进行对出现的数字进行记录计数,每一次出现相同数字都会与前面的数字形成对相应相等关系记录前文相等数的数量即可。
例:1,2,3,1,1,3 当map记录到下标为4时,nums[4]的1会与nums[0]和nums[3]都相对应,直接相加前面两个1出现的数量既可以完成相等组队(0,4)(3,4)-下标,两对。
复杂度O(n)
func numIdenticalPairs(nums []int) int {
tmp := make(map[int]int)
var total int
for _,num := range nums {
total += tmp[num]
tmp[num]++
}
return total
}