# 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
}
```