Au verso (25) dans le tableau

titre

[Dans le tableau de deux nombres, si un nombre est supérieur à l'avant derrière les figures, les deux nombres forment une paire inverse. Entrez un tableau, ce tableau P. trouve le nombre total de paire inversée P et sort le résultat modulo 1000000007. À savoir, la sortie P% 1000000007]
L'entrée: 7564
Rendement: 5


1, l' analyse
(1), est d'utiliser l' approche de force brute ont été comparées à chaque élément de l'élément arrière, dans ce cas le temps de complexité est la ( n 2 ) O (n ^ 2) , pas la meilleure façon, si l'utilisation d'autres méthodes. Tels que: Trifusion, alors questatistiques sur le nombre de revers. Cette complexité de temps est la ( n l o g n ) O (nlogn)
(2),abord la taille de la matriceorigine est progressivement décomposé en un tableau de 1, puis soumis àfusion progressive. La figure suivante
Insérer ici l'image Description
(3), puis entre les deux sous-réseaux statistiques inverses, comme indiqué cidessous:
Insérer ici l'image Description
Insérer ici l'image Description


2, le code

class Solution {
public:
    int InversePairs(vector<int> data) {
        int len=data.size();
        if(len<=1)
            return 0;
        vector<int> temp(len);
        // 需要将count声明为long,否则可能有溢出的错误
        long count=0;
        MergeSort(data,temp,0,len-1,count);
        return count%1000000007;
    }
    // count 用于统计最终的逆序对数
    void MergeSort(vector<int> &data,vector<int> &temp,int left,int right,long &count)
    {
        if(left<right)
        {
            int mid=left+(right-left)/2;
            MergeSort(data,temp,left,mid,count);
            MergeSort(data,temp,mid+1,right,count);
            Merge(data,temp,left,mid,right,count);
        }
    }
    
    void Merge(vector<int> &data,vector<int> &temp, int left,int mid,int right,long &count)
    {
        int i=mid;
        int j=right;
        int index=right-left;
        while(i>=left && j>mid)
        {
            if(data[i]>data[j])
            {
                temp[index--]=data[i--];
                count+=j-mid; //若前一个大于后一个则会有 j-mid 个逆序对
            }
            else
            {
                temp[index--]=data[j--];
            }
        }
        while(i>=left)
        {
            temp[index--]=data[i--];
        }
        while(j>mid)
        {
            temp[index--]=data[j--];
        }
        
        index=right-left;
        while(left<=right)
        {
            data[right--]=temp[index--];
        }
    }
};
Publié 213 articles originaux · louange gagné 48 · vues 110 000 +

Je suppose que tu aimes

Origine blog.csdn.net/Jeffxu_lib/article/details/104865484
conseillé
Classement