树状数组+离散化+二分
将nums数组中所有元素以及它们自己的两倍都放到新数组a中,对a排序去重后完成离散化。然后枚举nums中的元素,每次枚举元素的两倍在a中位置,在树状数组中去找到比它大的元素有多少累加到答案上,然后再把这个数加到树状数组中。
class Solution {
public:
int tr[100010];
int n;
int lowbit(int x){
return x&-x;
}
void add(int u,int k){
for(int i=u;i<=n;i+=lowbit(i)) tr[i]+=k;
}
int query(int u){
int res=0;
for(int i=u;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int reversePairs(vector<int>& nums) {
vector<long long> a;
for(auto c:nums){
a.push_back(1LL*c);
a.push_back(1LL*c*2);
}
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
int ans=0;
n=a.size()+1;
for(auto c:nums){
int l=lower_bound(a.begin(),a.end(),1LL*c*2)-a.begin()+1;
int r=a.size();
ans+=query(r)-query(l);
add(lower_bound(a.begin(),a.end(),1LL*c)-a.begin()+1,1);
}
return ans;
}
};
时间复杂度:
空间复杂度: