重点:归并排序 的变种 import java.util.*; public class Solution { public static long ans = 0; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int InversePairs(int[] nums) { if (nums.length == 0) return 0; mergeSort(nums, 0, nums.length - 1); return (int)(ans % 1000000007); } public void mergeSort(int[] array, int left, int right) { if (left >= right) return; int mid = left + (right - left) / 2; mergeSort(array, left, mid); mergeSort(array, mid + 1, right); merge(array, left, mid, right); } public void merge(int[] array, int left, int mid, int right) { int l_pos = left; int r_pos = mid + 1; int pos = left; int[] tempArray = new int[array.length]; while (l_pos <= mid && r_pos <= right) { if (array[l_pos] <= array[r_pos]) { tempArray[pos++] = array[l_pos++]; } else { tempArray[pos++] = array[r_pos++]; // 计算逆序对 // 奥妙之处 此时发现逆序对 计数增加mid-l_pos+1,因为当前面的数组值array[l_pos]大于后面数组值array[r_pos]时;则前面数组array[l_pos]~array[mid]多个元素都是大于array[r_pos]的 ans += (mid - l_pos + 1); ans %= 1000000007; } } while (l_pos <= mid) { tempArray[pos++] = array[l_pos++]; } while (r_pos <= right) { tempArray[pos++] = array[r_pos++]; } // 将排序后的结果复制回原数组 while (left <= right) { array[left] = tempArray[left]; left++; } } }