题目描述
解题思路
戳这里有篇 优质题解
vector<int>index;
vector<int> countSmaller(vector<int>& nums) {
if(!nums.size()) return {};
vector<int>res(nums.size(),0);
for(int i=0;i<nums.size();i++) index.push_back(i);
merge(nums,0,nums.size()-1,res);
return res;
}
void merge(vector<int>& nums,int l,int r,vector<int>& res){
if(l==r) return;
int mid=(l+r)>>1;
merge(nums,l,mid,res);
merge(nums,mid+1,r,res);
vector<int>temp1=index;
int li=l,ri=mid+1,j=l;
while(li<=mid||ri<=r){
if(li>mid||(ri<=r&&nums[temp1[li]]>nums[temp1[ri]])){
index[j++]=temp1[ri++];
}
else{
index[j++]=temp1[li];
if(li<=mid) res[temp1[li]]+=ri-mid-1;
li++;
}
}
}
时间复杂度:O(NlogN)
空间复杂度:O(N)