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;至于为啥,我没想明白


京公网安备 11010502036488号