【剑指offer】题目36 数组中的逆序对
数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对
如:1,2,1,2,1 有3个逆序对
思路:知道O(N2)肯定是错的。开始想hash,试图找到O(n)的算法,想了很久,找不到。后来想到排序,用原数组与排好序的数组对比,我写的快排,还是不对。想了几个小时,无奈看答案,原来是用变形的归并排序。排序真是博大精深,换个样子我就想不到了....
在牛客网上AC的代码:脑子不清醒,各种小错,提交了好多遍。
class Solution { public: void myMergeSort(vector<int> &data, int & ans, int l, int r, vector<int> &v) { if(l >= r) return; int m = l + (r - l) / 2; myMergeSort(data, ans, l, m, v); myMergeSort(data, ans, m + 1, r, v); myMerge(data, ans, l, m, r, v); } void myMerge(vector<int> &data, int & ans, int l, int m, int r, vector<int> &v) { int n1 = m - l + 1; int k = 0, i = l, j = m + 1; while(i <= m && j <= r) { if(data[i] <= data[j]) { v[k++] = data[i++]; } else { v[k++] = data[j++]; ans += m - i + 1; } } while(i <= m) v[k++] = data[i++]; while(j <= r) v[k++] = data[j++]; for(k = 0; k < r - l + 1; k++) data[k + l] = v[k]; } int InversePairs(vector<int> data) { int ans = 0; vector<int> v(data.size()); myMergeSort(data, ans, 0, data.size() - 1, v); return ans; } };