1512. 好数对的数目

104 阅读1分钟

题目

image.png

暴力求解

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

复杂度

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

编码

/**
 * @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)

编码

/**
 * @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)
};