1. 程式人生 > >(劍指offer)陣列中的逆序對

(劍指offer)陣列中的逆序對

時間限制:2秒 空間限制:32768K 熱度指數:228207
本題知識點: 陣列

題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字

資料範圍:

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

示例1
輸入
複製
1,2,3,4,5,6,7,0
輸出
複製
7

思路
歸併排序。特別注意陣列兩半,左邊,右邊都是從右到左比較判定,否則會重複記錄

public class Solution {
    public int InversePairs(int [] array) {
        if(array == null || array.length <= 1){
            return 0;
        }
        //思路:歸併排序
        int[] tmp = new int[array.length];
        return mergeSort(array, 0, array.length-1, tmp)%1000000007;
    }
    private int mergeSort(int[] a, int st, int en, int[] tmp){
        if(st >= en){
            return 0;
        }
        int mid = (st+en)/2;
        
        int leftCnt = mergeSort(a, st, mid, tmp)%1000000007;
        int rightCnt = mergeSort(a, mid+1, en, tmp)%1000000007;
        int left = mid;
        int right = en;
        int i = en;
        int cnt = 0;
        while(left >=st && right >= mid+1){
            if(a[left] > a[right]){
                tmp[i--] = a[left--];
                cnt = (cnt + right - mid)%1000000007;
            }else{
                tmp[i--] = a[right--];
            }
        }
        while(left >= st){
            tmp[i--] = a[left--];
        }
        while(right >= mid+1){
            tmp[i--] = a[right--];
        }
        for(int j = st; j <= en; j++){
            a[j] = tmp[j];
        }
        return (leftCnt + rightCnt + cnt)%1000000007;
    }
}