import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param nums int整型一维数组 * @return int整型 */ private static final int MOD = 1000000007; public int InversePairs (int[] nums) { int count = 0; // write code here count = mergeAndSort(0, nums.length - 1, nums, new int[nums.length]); return count % MOD; } private int mergeAndSort(int left, int right, int[] arr, int[] tmp) { if (left >= right) { return 0; } int mid = (left + right) / 2; int res = mergeAndSort(left, mid, arr, tmp) + mergeAndSort(mid + 1, right, arr, tmp); // 合并过程 for (int i = left; i <= right; i++) { tmp[i] = arr[i]; } int i = left; int j = mid + 1; for (int k = left; k <= right; k++) { if (i == mid + 1) { // 左边的已经处理完了,将右边的全部复制进去 arr[k] = tmp[j++]; } else if (j == right + 1) { arr[k] = tmp[i++]; } else { if (tmp[i] <= tmp[j]) { arr[k] = tmp[i++]; } else { arr[k] = tmp[j++]; // 当 tmp[i] > tmp[j] 时,说明从 i 到 mid 的所有元素都和 tmp[j] 构成逆序对 res += mid - i + 1; res %= MOD; // 防止结果溢出,对结果取模 } } } return res; } }
首先明白题目的意思,我理解错误了,[1,2,3,4,5,6,7,0]中不是1个逆序对(7,0),而是有7个,1,0;2,0;3,0;4,0;5,0;6,0;7,0都是逆序对,不需要加仅仅挨在一起。
要求nlogn的话,肯定是一个递归排序。解题思路按照提示来的,使用归并排序的思想。我们写一个规定排序的过程,一个递归拆成2段,然后再合并。合并的时候有好几种情况,第一种情况,左边的完了,右边还没完,将右边的放进去就好了。另外一种情况,左边的还没完,右边的全完了,将左边的复制过去。第三种情况,两边正常进行中,如果左边的小于右边的,则复制左边的,指针挪一个,否则就移动右边的,并且将将指针往后挪一个。以上是规定排序的思想,想象一下,左边和右边都已经是有序了,这个时候如左边的比右边的大,说明了,左边的剩下的都比右边大。因此res= res + mid -i +1;至于为啥,我没想明白