题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
//此题思路类似于归并排序,把数组不断地分解,直到长度为1,然后把相邻的子数组合并,再合并过程中判断
public class Solution {
public static int count = 0;
public static int InversePairs(int [] array) {
if (array.length <= 1 || array == null){
return 0;
}
mergeSort(array, 0, array.length - 1);
return count;
}
public static void mergeSort(int [] array, int left, int right) {
if (left == right) {
return;
}
int mid = (right + left ) / 2;
mergeSort(array, left, mid); //分解左半部分
mergeSort(array, mid + 1, right); //分解右半部分
merge(array, left, mid, right); //合并左右子数组
}
//此时左子数组和右子数组都已经排好序了,进行合并
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int k = 0;
int p1 = left;
int p2 = mid + 1;
while(p1 <= mid && p2 <= right) {
if (arr[p1] < arr[p2]) {
temp[k++] = arr[p1++];
} else {
//计算可组成逆序对的个数
count += mid - p1 + 1;
count = count % 1000000007;
temp[k++] = arr[p2++];
}
}
//两个必有一个越界
while(p1 <= mid) {
temp[k++] = arr[p1++];
}
while(p2 <= right) {
temp[k++] = arr[p2++];
}
//在拷贝到原数组
for (k = 0; k < temp.length; k++) {
arr[left + k] = temp[k];
}
}
}