剑指offer51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
分析:归并排序,在归并的时候多加一行代码统计逆序对即可
class Solution { public: vector<int> a, t; int cnt = 0; void merge(int l, int r) { if (r - l <= 1) return; int mid = l + (r - l >> 1); merge(l, mid); merge(mid, r); // merge int p = l, q = mid, s = l; while (s < r) { if (p >= mid || q < r && a[p] > a[q]) { t[s++] = a[q++]; cnt += mid - p; } else { t[s++] = a[p++]; } } for (int i = l; i < r; ++i) a[i] = t[i]; } int reversePairs(vector<int>& nums) { a = nums; t = nums; merge(0, a.size()); return cnt; } };