题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
class Solution { public: long res = 0; long kmod = 1000000007; void merge(int lo, int mi, int hi, vector<int>& arr) { vector<int> b; b.assign(arr.begin() + lo, arr.begin() + mi); int lb = mi - lo; int lc = hi - mi; for (int i = 0, j = 0, k = 0; (j < lb) or (k < lc); ) { if (j < lb and (lc <= k or b[j] <= arr[mi + k])) arr[lo + i++] = b[j++]; if (k < lc and (lb <= j or arr[mi + k] < b[j])) { // 右边比左边大 if (j < lb) { res += (lb - j); // 加的是左边区间的剩余元素个数 res %= kmod; } arr[lo + i++] = arr[mi + k++]; } } } void mergeSort(int lo, int hi, vector<int>& arr) { if (hi - lo < 2) return; int mi = (lo + hi) >> 1; mergeSort(lo, mi, arr); mergeSort(mi, hi, arr); merge(lo, mi, hi, arr); } int InversePairs(vector<int> data) { mergeSort(0, data.size(), data); return res; } };
归并排序,只要右区间有元素被调整到了前面,且左区间还有元素的情况下,就证明有逆序对存在,res加的值就是左区间剩余元素的个数。
#归并排序#