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