【题解提供者】吴立强
解法
思路
圆形排列中存在 n n n 对大小关系,如果存在一种合法的获得序列的方式,只有当存在不超过一对相邻小朋友,满足顺时针方向的小朋友的数字小于前一个小朋友。否则应当是无解的。
代码展示
#include <iostream>
using namespace std;
const int N = 200009;
int a[N];
int main() {
int n; cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
int tp = n, ans = 0; /// tp 必须赋初值,运行后可能 ans=0
for(int i = 2; i <= n; i ++) {
if(a[i - 1] > a[i]) { /// 判断是否存在破环递增的位置
ans ++; /// 记录位置数
tp = i; /// 记录起始坐标
}
}
if(a[n] > a[1]) { /// 还有一对边界关系
ans ++;
tp = 1;
}
if(ans > 1) cout << "-1"; /// 破环的位置超过一个,必然无法成立
else {
for(int i = 1; i <= n; i ++) { /// 从起始坐标走 n 步即可
cout << a[tp] << ' ';
tp ++;
if(tp > n) tp = 1; /// 越界就特判回来
}
}
return 0;
}
算法分析
程序时间复杂度为 O ( n ) O(n) O(n)。
需要注意存在全部相同和递增、递减的案例。