算法(JS):统计坏数对的数目

89 阅读1分钟

image.png

分析

坏数对(i, j)需满足条件:

  1. i < j
  2. j - i !== nums[j] - nums[i]

观察条件2,移项可得: nums[j] - j != nums[i] - i

由此,对于下标index,可得出该位置的指标为:index - nums[index]

原题可转换为:指标不同的下标可组成多少个不同的二元组

解法

对所有可能的(i, j),我们枚举j,边枚举边记录已出现的指标的值及其出现次数,可实现时间复杂度为O(n)的解法

对于位置[j]: 假设指标为[x], [0, j - 1]中指标[x]出现次数为[count], 可以计算出[0, j - 1]中指标不为x的位置个数为[j - count],这[j - count]个位置可分别与j组成满足条件的(i, j)

上代码 `

/**
 * @param {number[]} nums
 * @return {number}
 */
// 指标: nums[i] - i
var countBadPairs = function(nums) {
    const keyRecord = new Map(); 
    let res = 0;
    for(let i = 0; i < nums.length; i++) {
        const curKey = nums[i] - i;
        const preCount = (keyRecord.get(curKey) ?? 0);
        res += i - preCount;
        keyRecord.set(curKey, preCount + 1);
    }
    return res;
};

`

2364. 统计坏数对的数目 - 力扣(LeetCode)