數組中的逆序對

題目描述

在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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];
    }
}

以上就是這道題的解法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章