剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
归并排序
class Solution {
public:
int reversePairs(vector<int>& nums) {
vector<int> tmp(nums.size());
return mergeSort(0, nums.size() - 1, nums, tmp);
}
int mergeSort(int l, int r, vector<int>& nums, vector<int>& tmp){
if(l >= r) return 0;
int m = (l + r) /2;
int res = mergeSort(l, m, nums, tmp) + mergeSort(m + 1, r, nums, tmp);
for(int k = l; k <= r; k++)
tmp[k] = nums[k];
int i = l, j = m + 1;
for(int k = l; k <= r; k++){
if(i == m + 1){
nums[k] = tmp[j++];
}else if(j == r + 1 || tmp[i] <= tmp[j]){
nums[k] = tmp[i++];
}else{
nums[k] = tmp[j++];
res += m - i + 1;
}
}
return res;
}
};