數(shù)組中的逆序?qū)?/h2>

在數(shù)組中的兩個數(shù)字,如果前面一個數(shù)字大于后面的數(shù)字,則這兩個數(shù)字組成一個逆序?qū)Α]斎胍粋€數(shù)組,求出這個數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對1000000007取模的結(jié)果輸出。 即輸出P%1000000007

public class Solution {
    public int InversePairs(int [] array) {
        int len = array.length;
        return (int) dfs(array, 0, len-1)%1000000007; // 類似歸并排序
    }
    public double dfs(int[] array, int start, int end){
        if(start>=end)
            return 0;
        int mid = (start + end)/2;//分成兩段
        
        double leftPartCnts = dfs(array,start,mid);//左段內(nèi)部的逆序數(shù)
        double rightPartCnts = dfs(array, mid+1, end);//右段的逆序數(shù)
        
        int foreIdx = mid;//左段的指針,初始指向最后一個元素
        int endIdx = end;//右段的指針,初始指向最后一個元素
        long cnts = 0;//記錄合并產(chǎn)生的逆序數(shù)
        int[] copy = new int[end-start+1];//合并時用到的臨時數(shù)組
        int copyIdx = copy.length-1;//從右往左填充臨時數(shù)組
        while(foreIdx >= start && endIdx >= mid+1){//如果左段的元素和右段的元素都沒有遍歷完
            if(array[foreIdx]>array[endIdx]){// 如果左段元素 > 右段元素
                copy[copyIdx--] = array[foreIdx--]; //把較大的元素放入copy
                cnts += endIdx-mid; // 此時endIdx前的元素和foreIdx肯定也是逆序?qū)?,所以新增了endIdx-(mid+1—)+1個逆序?qū)?            }else{
                copy[copyIdx--] = array[endIdx--]; //不產(chǎn)生逆序?qū)?,直接放入copy
            }
        }
        while(foreIdx>=start){
            copy[copyIdx--] = array[foreIdx--];// 把左段剩余的元素加入copy
        }
        while(endIdx>=mid+1){
            copy[copyIdx--] = array[endIdx--];// 把右段剩余的元素加入copy
        }
        int tmpStart =start;
        for(int el:copy){ // 把copy放到array對應(yīng)的位置
            array[tmpStart++] = el;
        }
        if((leftPartCnts + rightPartCnts + cnts)>1000000007){//如果超出1000000007,先取余不影響最終結(jié)果,同時避免溢出
            return (leftPartCnts + rightPartCnts + cnts)%1000000007;
        }
        else return leftPartCnts + rightPartCnts + cnts;//逆序數(shù)=兩斷數(shù)組內(nèi)部的逆序數(shù)+兩段數(shù)組合并產(chǎn)生的逆序數(shù)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容