import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ private static int MOD = 1_000_000_007; private static int[] temp = new int[1_000_00]; // 辅助数组 public int InversePairs (int[] nums) { // write code here return sort(nums, 0, nums.length - 1); } private static int sort(int[] nums, int left, int right) { if (left == right) { return 0; } int mid = left + (right - left) / 2; int cnt1 = sort(nums, left, mid); // 左边逆序对数 int cnt2 = sort(nums, mid + 1, right); // 右边逆序对数 int ans = (cnt1 + cnt2) % MOD; int i = left, j = mid + 1, k; // 进行归并排序 for (k = left; i <= mid && j <= right; k++) { if (nums[i] <= nums[j]) { temp[k] = nums[i++]; } else { temp[k] = nums[j++]; ans = (ans + mid - i + 1) % MOD; // nums[j] 构成的逆序对数 } } while (i <= mid) { temp[k++] = nums[i++]; // 此处不会再构成逆序对 因为在上面中右侧所有的逆序对都已经计算过 } while (j <= right) { temp[k++] = nums[j++]; } for (k = left; k <= right; k++) { nums[k] = temp[k]; } return ans; // 总个数 } }