题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int InversePairs(int[] nums) { if (nums == null || nums.length <= 1) { return 0; } return mergeSort(nums, 0, nums.length - 1) % 1000000007; } /** * 归并排序,统计逆序对的数量 * @param nums 数组 * @param left 左边界 * @param right 右边界 * @return 逆序对的数量 */ public int mergeSort(int[] nums, int left, int right) { if (left >= right) { return 0; } int mid = (left + right) / 2; // 分别对左右两个部分进行归并排序 int leftNum = mergeSort(nums, left, mid); int rightNum = mergeSort(nums, mid + 1, right); // 合并左右两个有序数组并统计逆序对数量 int leftAndRight = merge(nums, left, mid, right); // 返回当前合并阶段发现的逆序对数量 return rightNum + leftNum + leftAndRight; } /** * 合并两个有序数组,并统计逆序对的数量 * @param nums 数组 * @param left 左边界 * @param mid 中间索引 * @param right 右边界 * @return 当前合并阶段发现的逆序对数量 */ public int merge(int[] nums, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int leftStart = left; int rightStart = mid + 1; int index = 0; int count = 0; // 统计逆序对的数量 while (leftStart <= mid && rightStart <= right) { if (nums[leftStart] <= nums[rightStart]) { temp[index++] = nums[leftStart++]; } else { temp[index++] = nums[rightStart++]; // 统计逆序对的数量,因为右边数组有一个元素小于左边数组的当前元素,说明构成了逆序对 count += mid - leftStart + 1; // 对逆序对数量进行取模,避免溢出 count %= 1000000007; } } // 将左边数组剩余的元素复制到临时数组 while (leftStart <= mid) { temp[index++] = nums[leftStart++]; } // 将右边数组剩余的元素复制到临时数组 while (rightStart <= right) { temp[index++] = nums[rightStart++]; } // 将临时数组中的元素拷贝回原数组 for (int i = 0; i < temp.length; i++) { nums[left + i] = temp[i]; } // 返回当前合并阶段发现的逆序对数量 return count; } }