题目
暴力求解
两层循环,外层循环起始值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
|
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
|
function arithmeticSeriesSum(n) { return (1 + n) * n / 2; }
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) };
|