题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
方法1:
主要思路:
(1)使用归并排序进行统计,只需要在原始归并排序中,增加一个统计逆序的变量即可;
class Solution {
public:
void merge_sort(vector<int>& nums,vector<int>& copy_arr,int left,int right,int&count){
if(left>=right){
return;
}
int mid=left+(right-left)/2;
merge_sort(nums,copy_arr,left,mid,count);
merge_sort(nums,copy_arr,mid+1,right,count);
int i=left,j=mid+1,k=left;
while(i<=mid&&j<=right){
if(nums[i]>nums[j]){
copy_arr[k++]=nums[j++];
count+=mid-i+1;//统计
}
else{
copy_arr[k++]=nums[i++];
}
}
if(i<=mid){
copy(nums.begin()+i,nums.begin()+mid+1,copy_arr.begin()+k);
}
else{
copy(nums.begin()+j,nums.begin()+right+1,copy_arr.begin()+k);
}
copy(copy_arr.begin()+left,copy_arr.begin()+right+1,nums.begin()+left);
}
int reversePairs(vector<int>& nums) {
vector<int> copy_arr(nums.size(),0);
int count=0;
merge_sort(nums,copy_arr,0,nums.size()-1,count);
return count;
}
};