题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
解题思路:
归并排序,加逆序计数cntInversePairs = (cntInversePairs%1000000007+(rightEnd-start-mid))%1000000007;注意测试数据量过大,,取模操作((A+B)%C = A%C + B%C);另外需要辅助数组auxiliary,注意递归调用时交替data 与 auxiliary的顺序。
通过的C++代码:
class Solution {
public:
int InversePairs(vector<int> data) {
int result = 0;
int len = data.size();
if(data.empty() || len < 0)
{
return result;
}
vector<int> auxiliary(len);
for(int i=0; i<len; ++i)
{
auxiliary[i] = data[i];
}
result = calInversePairs(data,auxiliary,0,len-1)%1000000007;
//delete[] auxiliary;
return result;
}
int calInversePairs(vector<int>& data, vector<int>& aux, int start,int end)
{
if(start == end)
{
aux[start] = data[start];
return 0;
}
int mid = (end-start) /2;
int leftInversePairs = calInversePairs(aux,data,start,start+mid)%1000000007;
int rightInversePairs = calInversePairs(aux,data,start+mid+1,end)%1000000007;
int leftEnd = start+mid;
int rightEnd = end;
int cntInversePairs = 0;
int auxFlag = end;
while(leftEnd >= start && rightEnd > start+mid)
{
if(data[leftEnd] > data[rightEnd])
{
aux[auxFlag--] = data[leftEnd--];
cntInversePairs = (cntInversePairs%1000000007+(rightEnd-start-mid))%1000000007;
}
else
{
aux[auxFlag--] = data[rightEnd--];
}
}
while(leftEnd >= start)
{
aux[auxFlag--] = data[leftEnd];
leftEnd--;
}
while(rightEnd > start+mid)
{
aux[auxFlag--] = data[rightEnd];
rightEnd--;
}
return (cntInversePairs %1000000007+ leftInversePairs + rightInversePairs)%1000000007;
}
};