赞
踩
class Solution { public: void merge(vector<int>& nums,vector<int>& tmp,vector<int>& precount,vector<int>& count,vector<int>& nowpos,vector<int>& prepos,int left,int right) { int l = left,mid = (left + (right - left) / 2),r = mid + 1,pos = l; while(l <= mid && r <= right) { if(nums[l] <= nums[r]) { precount[pos] = count[l] + (r - mid - 1); nowpos[pos] = prepos[l]; tmp[pos++] = nums[l++]; } else { precount[pos] = count[r]; nowpos[pos] = prepos[r]; tmp[pos++] = nums[r++]; } } while(l <= mid) { precount[pos] = count[l] + (r - mid - 1); nowpos[pos] = prepos[l]; tmp[pos++] = nums[l++]; } while(r <= right) { precount[pos] = count[r]; nowpos[pos] = prepos[r]; tmp[pos++] = nums[r++]; } for(int i = left;i <= right;++i) { nums[i] = tmp[i]; count[i] = precount[i]; prepos[i] = nowpos[i]; } } void merge_nums(vector<int>& nums,vector<int>& tmp,vector<int>& precount,vector<int>& count,vector<int>& nowpos,vector<int>& prepos,int left,int right) { if(left >= right) return; int mid = (left + (right - left) / 2); merge_nums(nums,tmp,precount,count,nowpos,prepos,left,mid); merge_nums(nums,tmp,precount,count,nowpos,prepos,mid + 1,right); merge(nums,tmp,precount,count,nowpos,prepos,left,right); } vector<int> countSmaller(vector<int>& nums) { vector<int> idx(nums.size(),0),tmp(idx),count(idx),prepos(idx); vector<int> precount(idx),nowpos(idx); iota(prepos.begin(),prepos.end(),0); merge_nums(nums,tmp,precount,count,nowpos,prepos,0,tmp.size()-1); for(int i = 0;i < nums.size();++i) tmp[prepos[i]] = count[i]; return tmp; } };
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。