这个复杂度这么小,完全可以用
n
2
n^2
n2 的复杂度,每次交换其实改变的就是交换元素带来的逆序对数量的变化,设 big[i] 为第i个元素后比它的大的个数(成环看),sma是比它小的个数,每次改变量就是big - sma
#include<bits/stdc++.h>
using namespace std;
const int N = (int)2e4+5;
int big[N],sma[N]; // 想要得到最少的逆序对数量,那么必须要减少的比增加的多
// big 表示后面比它大的,这个会增加 那么就是要big - small 最小
int n;
int a[N];
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int now = 0; // 迭代计算
for(int i=1;i<=n;i++){
for(int j=i-1;j>0;j--){
if(a[i]>a[j]){
big[j]++;
sma[i]++;
}
if(a[i]<a[j]){
sma[j]++; // 这里是每次更新的数量
big[i]++;
}
}
now += big[i];
int ans = now;
int temp = now;
for(int k=1;k<=i;k++){
temp = temp+big[k]-sma[k];
ans = min(ans,temp);
}
cout << ans << " ";
}
}