題目描述
在數組中的兩個數字,如果前面一個數字大于后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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
這題就是歸并排序,最后的結果超過了int的存儲范圍,所以要用long。
public class Solution {
long count = 0;
public int InversePairs(int [] array) {
if(array.length==0){
return 0;
}
int[] tmpArray = new int[array.length];
mergeSort(array,tmpArray,0,array.length-1);
return (int)(count%1000000007);
}
public void mergeSort(int [] array, int[] tmpArray, int start ,int end){
if(start<end){
int mid = (end - start)/2 + start;
mergeSort(array, tmpArray, start, mid);
mergeSort(array, tmpArray, mid+1, end);
merge(array,tmpArray,start,mid,end);
}
}
public void merge(int [] array, int[] tmpArray, int start, int mid, int end){
int i=mid;
int j=end;
int k=end;
//這里和標準merge實現略有不同
while(i>=start && j>=(mid+1)){
if(array[i]>array[j]){
count+=(j-mid);
tmpArray[k]=array[i];
i--;
}else{
tmpArray[k]=array[j];
j--;
}
k--;
}
while(i>=start){
tmpArray[k]=array[i];
i--;
k--;
}
while(j>=(mid+1)){
tmpArray[k]=array[j];
j--;
k--;
}
System.arraycopy(tmpArray,start,array,start,end-start+1);
}
}