public class Num51数组中的逆序对重要 {
int count = 0;
public int reversePairs(int[] nums) {
mergeSort(nums, 0, nums.length - 1, new int[nums.length]);
return count;
}
private void mergeSort(int[] nums, int left, int right, int[] temp) {
if (left >= right) return;
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid, temp);
mergeSort(nums, mid + 1, right, temp);
merge(nums, left, mid, right, temp);
}
private void merge(int[] nums, int left, int mid, int right, int[] temp) {
int i = left, j = mid + 1, t = left;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[t++] = nums[i++];
} else {
temp[t++] = nums[j++];
count += mid - i + 1;
}
}
while (i <= mid) temp[t++] = nums[i++];
while (j <= right) temp[t++] = nums[j++];
for (int k = left; k <= right; k++) {
nums[k] = temp[k];
}
}
}