树状数组-逆序对
反向遍历数组,查找逆序对即可。
要注意的是需要给元素都加上一个偏移量delta来保证元素始终是正数。
class Solution {
public:
int delta=10001;
int tr[20010];
int lowbit(int x){
return x&-x;
}
void add(int u,int k){
for(int i=u;i<=20005;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;
}
vector<int> countSmaller(vector<int>& nums) {
int n=nums.size();
vector<int> cnt(n);
for(int i=n-1;~i;i--){
int k=nums[i]+delta;
cnt[i]=query(k-1);
add(k,1);
}
return cnt;
}
};
时间复杂度:O(nlogn)
空间复杂度:O(n)