1512. 好数对的数目

题目

image.png

暴力求解

两层循环,外层循环起始值i=0,内层循环起始值j=i+1,保证i<j。

复杂度

时间复杂度 O(n^2)
空间复杂度 O(1)

编码

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} nums
* @return {number}
*/
function numIdenticalPairs(nums) {
let count = 0;
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
count += nums[i] === nums[j];
}
}
return count;
}

等差数列求和

比如[1,2,3,1,1,3],因为要满足i<j,所以下标为0的1只能和后边的下标3、4组合,下标为3的只能和后边下标4组合,三个数字只能有2+1=3种组合,总结公式:n个数字只能有1+2+3+…+(n-1)种组合,等差数列求和。特殊情况:数组大小小于等于1就不存在任何组合。

复杂度

时间复杂度 O(n)
空间复杂度 O(n)

编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @param {number} n
* @return {number}
*/
function arithmeticSeriesSum(n) {
return (1 + n) * n / 2;
}

/**
* @param {number[]} nums
* @return {number}
*/
var numIdenticalPairs = function (nums) {
if (nums.length < 1) return 0
let map = {}
for (let num of nums) {
if (map[num]) {
map[num] += 1
} else {
map[num] = 1
}
}
return Object.values(map).reduce((total, _) => {
return total + arithmeticSeriesSum(_ - 1)
}, 0)
};