题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入
1, 2, 3, 4, 5, 6, 7, 0
输出
7
解题思路
这道题是典型的归并排序,只不过在原有的归并排序中增加了一行操作,就是如果前面的数大于后面的数的话,就要+1操作,记录一逆序对。所以这道题就相当于复习归并排序算法
public class Solution {
int count=0;
public int InversePairs(int [] array) {
if(array == null || array.length <= 0) return 0;
mergeAll(array, 0, array.length-1);
return count;
}
public void mergeAll(int [] arr, int l, int r){
if(l >= r) return;
int m = (l+r)>>1;
mergeAll(arr, l, m);
mergeAll(arr, m + 1, r);
merge(arr, l, m, r);
}
public void merge(int[] arr, int l, int m, int r){
int[] temp = new int[r - l + 1];
int i = l, j = m + 1, index = 0;
while(i <= m && j <= r){
if(arr[i] > arr[j]) {
temp[index++] = arr[j++];
count += m - i + 1;
count %= 1000000007;
}else temp[index++] = arr[i++];
}
while(i <= m) temp[index++] = arr[i++];
while(j <= r) temp[index++] = arr[j++];
for(int k = 0; k < temp.length; k++) arr[l + k] = temp[k];
}
}
以上就是这道题的解法。