树状数组
将不等式移项之后变成:
观察这个式子,把nums1[i]-nums2[i]视为a[i],可以联想到逆序对的处理方式,因此我们可以借用树状数组来统计每个a[i]满足不等式的元素,然后把它放到树状数组中去。
因为要处理元素的数据量范围最多到3e4,所以不需要离散化。
class Solution {
public:
vector<int> tr;
const int N=1e5;
int base=N*3+10;
int lowbit(int x){
return x&-x;
}
void add(int u,int k){
u+=base;
for(int i=u;i<tr.size();i+=lowbit(i)) tr[i]+=k;
}
long long query(int u){
long long res=0;
u+=base;
for(int i=u;i;i-=lowbit(i)) res+=1LL*tr[i];
return res;
}
long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int diff) {
tr.resize(N*+10);
int n=nums2.size();
long long ans=0;
for(int i=0;i<n;i++){
ans+=query(nums1[i]-nums2[i]+diff);
add(nums1[i]-nums2[i],1);
}
return ans;
}
};
时间复杂度:
空间复杂度: