題目描述
在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字潭枣,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)Ρ饶]斎胍粋€(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對(duì)1000000007取模的結(jié)果輸出盆犁。 即輸出P%1000000007
輸入描述:
題目保證輸入的數(shù)組中沒有的相同的數(shù)字
數(shù)據(jù)范圍:
對(duì)于%50的數(shù)據(jù),size<=10^4
對(duì)于%75的數(shù)據(jù),size<=10^5
對(duì)于%100的數(shù)據(jù),size<=2*10^5
輸入例子:
1,2,3,4,5,6,7,0
輸出例子:
7
這題就是歸并排序命咐,最后的結(jié)果超過了int的存儲(chǔ)范圍,所以要用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;
//這里和標(biāo)準(zhǔn)merge實(shí)現(xiàn)略有不同
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);
}
}