import java.util.*; public class Solution { // 思路:归并排序的思想,分治之后排序合并 public int mod = 1000000007; public int mergeSort(int left, int right, int[] nums, int[] temp) { if (left >= right) { return 0; } int mid = (left + right) / 2; // 递归分治,左右划分合并 int res = mergeSort(left, mid, nums, temp) + mergeSort(mid + 1, right, nums, temp); // 防止溢出 res %= mod; // 排序逻辑处理 int i = left, j = mid + 1; for (int k = left; k <= right; k++) { temp[k] = nums[k]; } for (int k = left; k <= right; k++) { if (i == mid + 1) { nums[k] = temp[j++]; } else if (j == right + 1 || temp[i] <= temp[j]) { nums[k] = temp[i++]; // 左边比右边大,答案增加 } else { nums[k] = temp[j++]; // 当左子数组的元素 temp[i] 大于右子数组的元素 temp[j] 时,temp[i] 及其后面的所有元素(从 i 到 mid)都与 temp[j] 构成逆序对,因此逆序对数量增加 mid - i + 1。 res += mid - i + 1; } } return res % mod; } public int InversePairs (int[] nums) { // write code here int n = nums.length; int[] res = new int[n]; return mergeSort(0, n - 1, nums, res); } }