题目地址:
https://leetcode.com/problems/count-number-of-bad-pairs/description/
给定一个长 n n n数组 a a a,问数组中有多少个数对 i , j i,j i,j满足 i < j , i − j ≠ a [ i ] − a [ j ] i<j,i-j\ne a[i]-a[j] i<j,i−j=a[i]−a[j]。
条件等价于 i < j , a [ i ] − i ≠ a [ j ] − j i<j,a[i]-i\ne a[j]-j i<j,a[i]−i=a[j]−j,我们可以反过来求 i < j , a [ i ] − i = a [ j ] − j i<j,a[i]-i= a[j]-j i<j,a[i]−i=a[j]−j的数对个数,可以开一个哈希表存 j < i , a [ j ] − j j<i,a[j]-j j<i,a[j]−j,这样对于 i i i来讲满足条件的数对个数就是 a [ j ] − j a[j]-j a[j]−j在哈希表里出现的次数。代码如下:
class Solution {
public:
using ll = long long;
ll countBadPairs(vector<int>& a) {
int n = a.size();
ll res = (ll)n * (n - 1) / 2;
unordered_map<int, int> mp;
for (int i = 0; i < n; i++) {
res -= mp[a[i] - i];
mp[a[i] - i]++;
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。