題目描述
在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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];
}
}
以上就是這道題的解法。