原题链接(官方题解视频讲的很好)
public int reversePairs(int[] nums) {
int len = nums.length;
if(len < 2) return 0;
int[] copy = new int[len];
System.arraycopy(nums, 0, copy, 0, len);
return reversePairs(copy, 0, len - 1, new int[len]);
}
private int reversePairs(int[] nums, int left, int right, int[] temp){
if(left == right) return 0;
int mid = left + (right - left) / 2;
int leftPairs = reversePairs(nums, left, mid, temp);
int rightPairs = reversePairs(nums, mid + 1, right, temp);
if(nums[mid] <= nums[mid + 1])
return leftPairs + rightPairs;
int mergeCount = mergeAndCount(nums, left, mid, right, temp);
return leftPairs + rightPairs + mergeCount;
}
private int mergeAndCount(int[] nums, int left, int mid, int right, int[] temp){
if (right + 1 - left >= 0)
System.arraycopy(nums, left, temp, left, right + 1 - left);
int l = left, r = mid + 1, count = 0;
for(int k = left; k <= right; k++){
if(l == mid + 1){
nums[k] = temp[r++];
} else if(r == right + 1){
nums[k] = temp[l++];
}
else if(temp[l] > temp[r]){
nums[k] = temp[r++];
count += mid - l + 1;
} else {
nums[k] = temp[l++];
}
}
return count;
}