题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
class Solution { private: int kmod = 1000000007; public: int InversePairs(vector<int> data) { if(data.size() == 0 || data.size() == 1) return 0; int l = 0,r = data.size() - 1,mid = (r - l) >> 1; vector<int> kmp(data.size(),0); int res = 0; Sort(data,kmp,l,r,res); return res; } void Sort(vector<int>& arr,vector<int>& kmp,int l,int r,int &res){ if(l >= r) return; int mid = l + ((r - l) >> 1); Sort(arr,kmp,l,mid,res); Sort(arr,kmp,mid + 1,r,res); Merge(arr,kmp,l,mid,r,res); } void Merge(vector<int>& arr,vector<int>& kmp,int l,int mid, int r,int &res){ int i = l,j = mid + 1,k = l; while(i <= mid && j <= r){ if(arr[i] > arr[j]){ kmp[k ++] = arr[j ++]; res += (mid - i + 1); res %= kmod; } else { kmp[k ++] = arr[i ++]; } } while(i <= mid){ kmp[k ++] = arr[i ++]; } while(j <= r){ kmp[k ++] = arr[j ++]; } for(int m = l;m <= r;m ++){ arr[m] = kmp[m]; } } };
跟着题解手打一遍归并排序,自己再打一遍。