题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
题解:
class Solution {
public:
int count = 0;
int InversePairs(vector<int> data)
{
int n = data.size();
mergesort(data,0,n-1);
return count;
}
void mergesort(vector<int> &data,int lo, int hi)
{
if(lo >= hi)
return;
int mid = (lo+hi)/2;
mergesort(data, lo, mid);
mergesort(data,mid+1,hi);
merge(data,lo,hi);
}
void merge(vector<int> &data,int lo,int hi)
{
vector<int> temp;
int mid = (lo+hi)/2;
int p1 = lo,p2=mid+1;
while(p1<=mid && p2 <= hi)
{
if(data[p1] > data[p2])
{
count = (count+mid-p1+1)%1000000007;
temp.push_back(data[p2++]);
}
else
{
temp.push_back(data[p1++]);
}
}
while(p1 <= mid)
temp.push_back(data[p1++]);
while(p2 <= hi)
temp.push_back(data[p2++]);
int start = lo;
for(int i=0;i<temp.size();++i)
{
data[start++] = temp[i];
}
}
};
解题思路:
归并排序法寻找逆序对。
在两个数组归并的过程中,如果前边的数组比后边的大了,那么在前边数组中这个数后边的数逗比后边的数组大,构成逆序。