num35 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数 。并将 对1000000007取模的结果输出。 即输出
代码:
class Solution {
public:
int InversePairs(vector<int> data) {
if (data.size() == 0)
return 0;
vector<int> copy(data); // 辅助数组,每次递归后有序
return InversePairsCore(data, copy, 0, data.size() - 1);
}
int InversePairsCore(vector<int>& data, vector<int>& copy, int begin, int end) {
if (begin == end)
return 0;
int mid = begin + (end - begin) / 2;
int left = InversePairsCore(copy, data, begin, mid);
int right = InversePairsCore(copy, data, mid + 1, end);
int last_in_left = mid; // 比较从尾端开始
int last_in_right = end; // 比较从尾端开始
int index_copy = end; // 比较结果存入辅助数组尾端
long res = 0;
// 归并排序:相当于两个有序数组合成一个有序表(从尾端开始是为了计数)
while (last_in_left >= begin && last_in_right >= mid + 1) {
if (data[last_in_left] > data[last_in_right]) {
copy[index_copy--] = data[last_in_left--];
res += last_in_right - mid;
}
else
copy[index_copy--] = data[last_in_right--];
}
while (last_in_left >= begin)
copy[index_copy--] = data[last_in_left--];
while (last_in_right >= mid + 1)
copy[index_copy--] = data[last_in_right--];
return (left + right + res) % 1000000007;
}
};