数组中的逆序对
题目链接:数组中的逆序对
解题思路:分治
先把数组分成子数组,统计出子数组内部的逆序对的数目,然后再统计出相邻两个子数组之间的逆序对的数目,在统计逆序对的过程中,还需要对数组进行排序。
代码如下:
int mod = 1000000007;
int mergeSort(int left, int right, vector<int>& data, vector<int>& temp) {
//停止划分
if (left >= right)
return 0;
//取中间
int mid = (left + right) / 2;
//左右划分合并
int res = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data, temp);
//防止溢出
res %= mod;
int i = left, j = mid + 1;
for (int k = left; k <= right; k++)
temp[k] = data[k];
for (int k = left; k <= right; k++) {
if (i == mid + 1)
data[k] = temp[j++];
else if (j == right + 1 || temp[i] <= temp[j])
data[k] = temp[i++];
//左边比右边大,答案增加
else {
data[k] = temp[j++];
//统计逆序对
res += mid - i + 1;
}
}
return res % mod;
}
int InversePairs(vector<int> data) {
int n = data.size();
vector<int> res(n);
return mergeSort(0, n - 1, data, res);
}