题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007(来源于剑指offer)
题目解析:正常做法逐个扫描时间复杂度O(n^2)肯定不行。就要找规律,这道题目是关于逆序对的,那么排序好的就不需要统计,当所有的数都排序好后(增序)这道题目也就完成了。所以这是一道排序的题目。可以降低时间复杂度,并且相互之间有序的排序算法就是归并排序。
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2)
return 0;
vector<int> copy(data.size());
int sum = 0;
InversePairCore(data, copy, sum, 0, data.size()-1);
return sum%1000000007;
}
void InversePairCore(vector<int> &data, vector<int>& copy, int &sum, int s, int e) {
if(s<e) {
int mid = (s+e)/2;
InversePairCore(data, copy, sum, s, mid);
InversePairCore(data, copy, sum, mid+1, e);
//排序 统计
int i=mid, j=e, k=e;
while(i>=s && j>=mid+1) {
if(data[i]>data[j]) {
sum = (sum + (j-mid))%1000000007;
copy[k--] = data[i--];
}
else {
copy[k--] = data[j--];
}
}
while(i>=s)
copy[k--] = data[i--];
while(j>=mid+1)
copy[k--] = data[j--];
for(i=s; i<=e; i++) {
data[i] = copy[i];
}
}
}
};