归并排序思想:
写了半个小时,没想到一遍过了。
class Solution {
public:
struct Node{
int loc;
int val;
int cnt;
Node(){}
Node(int a,int b,int c):loc(a),val(b),cnt(c){}
};
static bool cmp(const Node& x,const Node& y){
if(x.loc < y.loc) return true;
return false;
}
static void Ncopy(Node& x, Node& y){
x.loc = y.loc;x.val = y.val;x.cnt = y.cnt;
}
void merge_sort(vector<Node>& v,int L,int R){
if(L+1 >= R) return ;
int mid = (L+R)/2;
merge_sort(v,L,mid);
merge_sort(v,mid,R);
vector<Node> nv(R-L);
int i,j;
i = j = 0;
while(mid+i<R && L+j<mid){
if(v[mid+i].val < v[L+j].val){
Ncopy(nv[i+j],v[mid+i]);
i++;
}else{
Ncopy(nv[i+j],v[L+j]);
nv[i+j].cnt += i;
j++;
}
}
for(;mid+i<R;i++) Ncopy(nv[i+j],v[mid+i]);
for(;L+j<mid;j++){
Ncopy(nv[i+j],v[L+j]);
nv[i+j].cnt += i;
}
for(int k=0;k<R-L;k++) Ncopy(v[L+k],nv[k]);
}
vector<int> countSmaller(vector<int>& nums) {
int N = nums.size();
vector<Node> v(N);
for(int i=0;i<N;i++){
v[i].loc = i;
v[i].val = nums[i];
v[i].cnt = 0;
}
merge_sort(v,0,N);
sort(v.begin(),v.end(),cmp);
vector<int> ans;
for(int i=0;i<N;i++) ans.push_back(v[i].cnt);
return ans;
}
};