题目描述:
思路:
先统计出来数组中最长的递增序列x1,x2,x3,xn
这个序列里的数字不用变,最后剩下比x1小的 和 比xn大的数字需要调换顺序
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sf(x) scanf("%d", &x);
#define de(x) cout << x << " ";
#define Pu puts("");
const int N = 2e5 + 10;
int n, m, ans;
// 思路:先统计出来数组中最长的递增序列x1,x2,x3,,,xn
// 这个序列里的数字不用变,最后剩下比x1小的 和 比xn大的数字需要调换顺序
int cnt[N]; // 记录某个数字出现的次数
int f[N]; // 记录集合的标记号
int main() {
int T;
cin >> T;
int x;
int l, r;
while (T--) {
cin >> n;
memset(cnt, 0, sizeof(cnt));
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++) {
sf(x);
if (f[x - 1] == 0) {
f[x] = x;
cnt[f[x]]++;
} else {
cnt[f[x - 1]]++;
f[x] = f[x - 1];
}
}
ans = INT_MAX;
for (int i = 1; i <= n; i++) {
if (cnt[i] > 0) {
l = i - 1;
r = n - (i + cnt[i] - 1);
ans = min(ans, max(l, r));
}
}
printf("%d\n", ans);
}
return 0;
}