题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
对于50%的数据,size≤10^4
对于75%的数据,size≤10^5
对于100%的数据,size≤2*10^5
知识点
数组,归并
思路
利用归并的思想,在归并排序的基础上计算逆序对。
代码
public class Solution {
int num=0;
public int InversePairs(int [] array) {
if(array==null||array.length<=0) return 0;
sort(array,0,array.length-1);
return num;
}
public void sort(int[] array,int start,int end){
if(array==null||start>=end) return;
sort(array,start,(end-start)/2+start);//为了防止大数溢出,写成(end-start)/2+start
sort(array,(end-start)/2+start+1,end);
merge(array,start,(end-start)/2+start,end);
}
public void merge(int[] array,int start,int mid,int end){
int i = start,j = mid+1,p = 0;
int[] temp = new int[end-start+1];
while(i<=mid&&j<=end){
if(array[i]>array[j]){
num = (num+mid-i+1)%1000000007;//加的数量是中间下标-当前下标+1.
temp[p++] = array[j++];
}
else temp[p++] = array[i++];
}
while(i<=mid) temp[p++] = array[i++];
while(j<=end) temp[p++] = array[j++];
for(int x=0;x<p;x++){
array[start+x] = temp[x];
}
}
}