在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
这个之前的笔记中已经说过这道题目了,是归并排序的典型应用。归并排序的基本思想是分治,在治的过程中有前后数字的大小对比,此时就是统计逆序对的最佳时机。
public class Solution {
int cnt;
public int InversePairs(int [] array) {
if(array.length != 0){
devide(array,0,array.length-1);
}
return cnt;
}
public void devide(int[] array,int start,int end){
if(start>=end)return;
int mid = start+(end-start)/2;
devide(array,start,mid);
devide(array,mid+1,end);
merge(array,start,end,mid);
}
public void merge(int[] array,int start,int end,int mid){
int[] temp = new int[end-start+1];
int i = start;
int j = mid+1;
int k=0;
while(i<=mid && j<=end){
if(array[i]<=array[j]){
temp[k++] = array[i++];
}else{
temp[k++] = array[j++];
cnt = (cnt + mid-i+1)%1000000007;
}
}
while(i<=mid){
temp[k++] = array[i++];
}
while(j<=end){
temp[k++] = array[j++];
}
for(k=0;k<temp.length;k++){
array[start+k] = temp[k];
}
}
}