题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
分析:类似于mergesort的思想,对于两个排序的数组,用两个指针分别指向末尾,比如p,q,如果p的值大于q,那么p与q和q之前所有数字都可以组成逆序对,count就加上后一个数组的长度,再将p指针前移继续比较;如果q的值比较大,那么直接将q前移,因为没有逆序对。每次比较的时候把较大的数字复制进额外申请的数组(mergesort不是原地排序,需要空间换时间)。
代码:
class Solution {
public:
int InversePairs(vector<int> data) {
int n=data.size();
return mergesort(data,0,n-1);
}
int mergesort(vector<int> &data,int low,int high){
if(low>=high) return 0;
int mid=(low+high)/2;
int left=mergesort(data,low,mid);
int right=mergesort(data,mid+1,high);
vector<int> nums(data);
int p=mid;
int q=high;
int count=0;
int k=high;
while(p>=low&&q>=mid+1){
if(data[p]>data[q]){
nums[k--]=data[p--];
count+=q-mid;
}else{
nums[k--]=data[q--];
}
}
while(p>=low){
nums[k--]=data[p--];
}
while(q>=mid+1){
nums[k--]=data[q--];
}
for(int i=low;i<=high;i++){
data[i]=nums[i];
}
return (left+right+count);
}
};
ps. 希望老板让我安静地狗带吧。。我真的不想再写论证报告了。。。