分析
坏数对(i, j)需满足条件:
- i < j
- 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;
};
`