小红有一个长度为 n 的排列,她每次可以选择两个数 a_i 和 a_j ,要求 i 和 j 的奇偶性相同,然后交换这两个数。问最少需要多少次操作才能使得数组变成有序的,如果不能变的有序,输出 -1。
第一行输入一个整数 n ,表示数组的长度。 第二行输入 n 个整数 a_1, a_2, ..., a_n ,表示数组的元素。 1 ≤ n ≤ 10^5 1 ≤ a_i ≤ n
如果能变成有序的,输出最少需要的操作次数,否则输出 -1。
5 1 4 5 2 3
2
考点:排序 · 贪心
数据规模 n ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:排序
先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。
思路框架(排序 通法 · 非本题专属)
实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。
复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 5 / 1 4 5 2 3 → 输出 2
需要交换 a_2, a_4 和 a_3, a_5 ,得到 [1, 2, 3, 4, 5]。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2023年秋招-京东-技术通用岗位-第七批笔试。