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
, 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
(2),abord la taille de la matriceorigine est progressivement décomposé en un tableau de 1, puis soumis àfusion progressive. La figure suivante
(3), puis entre les deux sous-réseaux statistiques inverses, comme indiqué cidessous:
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--];
}
}
};