题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
解析
这道题就是计算数组的逆序数,在线代中学过这个概念,其实逆序数就等于冒泡排序的交换次数,可以从两者的概念中得知这一点。
搞懂了归并排序这道题就简单了。下面的链接是讲归并排序的。
https://www.cnblogs.com/chengxiao/p/6194356.html
一开始用冒泡排序做超过时长,时间复杂度o(n^2)
归并排序则是o(nlogn)
void merge(vector<int>& data, vector<int>& temp, long long& sum, long long left, long long right, long long tMid){
long long l = left;
long long r = tMid+1;
long long tsum = tMid - left + 1;
long long no = left;
while(l<=tMid&r<=right){
if(data[l] <= data[r]){
temp[no++] = data[l++];
--tsum;
}else if(data[l] > data[r]){
temp[no++] = data[r++];
sum += tsum;
}
}
while(l<=tMid){
temp[no++] = data[l++];
}
while(r<=right){
temp[no++] = data[r++];
}
while(left<=right){
data[left] = temp[left];
++left;
}
}
void sort(vector<int>& data, vector<int>& temp, long long& sum, long long left, long long right){
if(left==right)return;
long long tMid = (left + right) / 2;
sort(data, temp, sum, left, tMid);
sort(data, temp, sum, tMid + 1, right);
merge(data, temp, sum, left, right, tMid);
}
int InversePairs(vector<int> data) {
long long length = data.size();
vector<int> temp(length<<2);
long long sum = 0;
sort(data, temp, sum, 0, length-1);
return sum%1000000007;
}