---
# System prepended metadata

title: 1512. Number of Good Pairs

---

# 1512. Number of Good Pairs

## [題目:](https://leetcode.com/problems/number-of-good-pairs/)

給定一個一維陣列，要找出陣列裡含有幾個Good Pair，
Good Pair為數值相同且順序由前至後的兩個數，
就是要找出有幾個值為相同的配對。


## 思路一

順著題目意思往下解，雙迴圈由前置後，有相同值就累加一

```go=
func numIdenticalPairsV1(nums []int) int {
	var count = 0
	for i := 0; i < len(nums); i++ {
		for j := 0; j < i; j++ {
			if nums[i] == nums[j] {
				count++
			}
		}
	}
	return count
}
```

## 思路二

如果輸入是[1]，輸出為 0
如果輸入是[1,1]，輸出為 1 (+1)
如果輸入是[1,1,1]，輸出為 3 (+2)
如果輸入是[1,1,1,1]，輸出為 6 (+3)
...

題目可以改為由前至後 有哪幾種排列組合的可能，  
中間插進了不同的數值不會對排序造成影響。  

把總共有幾個相同的值，數量存進map中，  
最後再一次做可能性的累加  

```go=
func numIdenticalPairsV2(nums []int) int {
	var countMap = map[int]int{}
	for _, n := range nums {
		countMap[n] += 1
	}

	var count = 0
	for _, c := range countMap {
		for i := 0; i < c; i++ {
			count += i
		}
	}
	return count
}

```

但累加的過程還是用到了雙迴圈

## 思路三

為了把雙迴圈去除掉，
找出 0,1,3,6,10 序列的公式，  
序列中的第n項值為: n(n-1)/2  

```go=
func numIdenticalPairsV3(nums []int) int {
	var countMap = map[int]int{}
	for _, n := range nums {
		countMap[n] += 1
	}

	var count = 0
	// In 0:0, 1:1, 2:3, 4:6, 5:10 sequence,
	// the formula is n:n(n-1)/2 where n > 1
	for _, c := range countMap {
		if c > 1 {
			count += c * (c - 1) / 2
		}
	}
	return count
}

```