求逆序对一般使用归并排序的思想。
假设目前在递归过程中,左右两个子数组指针为l、r。由于归并排序是先排序左右子数组,所以此时左右子数组已经有序。当data[l] > data[r]时,根据左边子数组有序的性质,左子数组中下标在l之后的数也一定大于data[r],从而l到左子数组末尾的数与data[r]都构成逆序对。
class Solution {
public:
const int MOD = 1000000007;
long long mergeSort(vector<int>& data, int l, int r) {
if (l >= r) return 0;
int mid = l + (r - l) / 2;
long long ln = mergeSort(data, l, mid), rn = mergeSort(data, mid + 1, r);
long long res = (ln + rn) % MOD;
vector<int> tmp;
int il = l, ir = mid + 1;
while (il <= mid && ir <= r) {
if (data[il] < data[ir]) {
tmp.push_back(data[il++]);
}
else {
res = (res + mid - il + 1) % MOD;
tmp.push_back(data[ir++]);
}
}
while (il <= mid) {
tmp.push_back(data[il++]);
}
while (ir <= r) {
tmp.push_back(data[ir++]);
}
for (int i = 0; i < tmp.size(); i++) {
data[l + i] = tmp[i];
}
return res;
}
int InversePairs(vector<int> data) {
return (int)mergeSort(data, 0, data.size() - 1);
}
};

京公网安备 11010502036488号