在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
class Solution {
public:
vector<int> copyData;
vector<int> data;
int InversePairs(vector<int> newData) {
data=newData;
if(data.size()==0)
return 0;
for(int i=0;i<data.size();i++)
copyData.push_back(data[i]);
int count=InversePairsCore(0,data.size()-1);
return count;
}
int InversePairsCore(int start,int end){
if(start==end){
copyData[start]=data[start];
return 0;
}
int length=(end-start)/2;
int left=InversePairsCore(start,start+length);
int right=InversePairsCore(start+length+1,end);
int i=start+length;
int j=end;
int indexCopy=end;
int count=0;
while(i>=start&&j>=start+length+1){
if(data[i]>data[j]){
copyData[indexCopy--]=data[i--];
count+=j-start-length;
}else
copyData[indexCopy--]=data[j--];
}
for(;i>=start;--i)
copyData[indexCopy--]=data[i];
for(;j>=start+length+1;j--)
copyData[indexCopy--]=data[j];
for(int i=0;i<data.size();i++)
data[i]=copyData[i];
return left+right+count;
}
};