离散化+树状数组
将数组的元素按去重后的长度重新分配大小,离散化后方便利用树状数组进行处理。如[1000,1500,1250,2000,1000]离散化后变为[1,3,2,4,1],枚举离散化后的数组元素,用前缀和思想查找有多少个元素比当前元素大,然后更新答案,将当前的元素插入到树状数组中。
class Solution {
public:
vector<int> a;
int tr[50010];
int n,ans;
int lowbit(int x){return x&-x;};
void add(int x,int k){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=k;
}
}
int query(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int reversePairs(vector<int>& nums) {
a=nums;
n=nums.size();
sort(a.begin(),a.end());
int len=unique(a.begin(),a.end())-a.begin();
for(auto &c:nums){
c=lower_bound(a.begin(),a.begin()+len,c)-a.begin()+1;
ans+=query(len)-query(c);
add(c,1);
}
return ans;
}
};
时间复杂度:O(nlogn),排序的复杂度nlogn,逆序对查找为nlogn。
空间复杂度:O(n)。