https://www.lintcode.com/problem/reverse-pairs/description
说在前面:
归并排序面微策略没说上来,今天心血来潮刷剑指遇到了,和书上一模一样的代码过不了,输出中间变量发现不是传引用,vector不传引用坑了我一个小时
思路:考虑逆序对就是后面的数比前面的大,分前后一半的比较想到归并排序(一开始写成冒泡超时了,2B的我,冒泡不还是平方的时间复杂度么,写不写排序没区别啊)接下来就是一边归并一边统计,发现前面的大于后面的 就+(j - len - l);
class Solution {
public:
/**
* @param A: an array
* @return: total of reverse pairs
*/
long long merge_sort(vector<int> &data, vector<int> &s, int l, int r) {
if (l == r) {
s[l] = data[l];
return 0;
}
long long tot = 0;
int len = (r - l)/2;
long long totl = merge_sort(s, data, l, l + len);
long long totr = merge_sort(s, data, l + len + 1, r);
int i = l + len, j = r;
int q = r;
while(i >= l && j >= l + len + 1) {
if (data[i] > data[j]) {
s[q--] = data[i];
tot += (j - len - l);
i --;
} else {
s[q--] = data[j];
j --;
}
}
while (i >= l) s[q--] = data[i--];
while (j >= l + len + 1) s[q--] = data[j--];
return tot + totl + totr;
}
long long reversePairs(vector<int> &A) {
// write your code here
int len = A.size();
vector<int>s;
if (len <= 1){
return 0;
}
for (int i = 0; i < len; i ++) {
s.push_back(A[i]);
}
return merge_sort(A, s, 0, len-1);
}
};