class Solution {
public:
int reversePairs(vector<int>& nums) {
if(nums.size() == 0)
return 0;
int n = nums.size();
vector<int> tmp(n);
for(int i = 0; i < n; i++)
tmp[i] = nums[i];
return mergeSort(nums, tmp, 0, n-1);
}
int mergeSort(vector<int>& nums, vector<int>& tmp, int l, int r){
if(l == r){
tmp[l] = nums[l];
return 0;
}
int m = (r-l)/2;
int leftNumber = mergeSort(tmp, nums, l, l+m);
int rightNumber = mergeSort(tmp, nums, l+m+1, r);
// i初始化为前半段最后一个数字的下标
int i = l+m;
// j初始化为后半段最后一个数字的下标
int j = r;
int p = r;
int sum = 0;
while(i >= l && j >= l+m+1){
if(nums[i] > nums[j])
{
tmp[p--] = nums[i--];
sum += j-l-m;
}
else{
tmp[p--] = nums[j--];
}
}
for(;i>=l;--i)
tmp[p--]=nums[i];
for(;j>=l+m+1;--j)
tmp[p--]=nums[j];
return sum + leftNumber + rightNumber;
}
};
剑指Offer系列51—数组中的逆序对
最新推荐文章于 2022-05-30 09:40:24 发布