數組中的逆序對

題目描述

在數組中的兩個數字,如果前面一個數字大于后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數。——劍指offer

分析:一般求總數,全部可能的種樹的題型基本都是用遞歸,回溯。
算法考察:歸并排序
這道題使用一個額外空間目的是將所有數字排序成有序狀態,同時分解子問題,對相鄰坐標的數進行對比,記下是否逆序。之后將其排序放入下一次父問題的比較之中并且不會重復計數。

例如:1 2 1 2 1,將其分成 A 1 2 1和 B 2 1兩個子問題,A的解為1并變成112,B的解為1變成12,求解子問題之后再從各自的最末端使用標記進行逐一對比。一旦A中標記比B中標記大(比如A中2比B中1大),且兩者都是有序的,因此A標記下的數,大于所有后者數組標記之前的所有數(包括該標記數)。直接算出此次歸并排序的逆序總數。

//test case, should return 3

public class Solution {
    
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] arr = {1,2,1,2,1};
        System.out.println(solution.getPairs(arr));
    }
    
    public int getPairs(int [] array) {
        
        if (array.length <= 1) {
            return array.length;
        }
        
        int[] arrayCopy = new int[array.length];
        
        for (int i = 0; i < arrayCopy.length; i++) {
            arrayCopy[i] = array[i];
        }
        
        int count = getPairsCount(array,arrayCopy,0,array.length-1);
        
        return count;
    }
    
    public int getPairsCount(int[] array, int[] arraycopy,int start,int end) {
        
        if (start == end) {
            arraycopy[start] = array[start];
            return 0;
        }
        
        int mid = (end-start)/2;
//      這個遞歸,注意參數中兩個數組的位置變化,每次都是對需要進行歸并的那個數組進行處理
        int left = getPairsCount(arraycopy, array, start, start+mid);
        int right = getPairsCount(arraycopy, array, start+mid+1, end);
        
        int count = 0;
        int index = end;
        int i = start+mid;
        int j = end;
        
        while (i >= start && j >= start+mid+1) {
            if (array[i] > array[j]) {
                arraycopy[index--] = array[i--];
                count += j - (start+mid);   
            }
            
            else {
                arraycopy[index--] = array[j--];
            }
        }
        
        for(;i >= start;--i){
            arraycopy[index--] = array[i];
        }
        for(; j >= start + mid +1; --j){
            arraycopy[index--] = array[j];
        }
        
        return count+left+right;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容