213小R的排列挑战
题解
小 R 有一个长度为 n 的排列,排列中的数字是 1 到 n 的整数。她每次操作可以选择两个数a_i
和a_j
进行交换,前提是这两个数的下标 i 和 j 的奇偶性相同(即同为奇数或同为偶数)。目标是通过最少的操作使数组变成升序排列,如果无法实现则输出-1。
思路
下标分组:将数组根据下标的奇偶性分为两部分:
- 奇数下标元素(0-based,即索引为 0,2,4,…)
- 偶数下标元素(索引为 1,3,5,…)
排序验证:
- 奇数下标的元素在最终的升序排列中应该是奇数序列,即
1,3,5,...
。 - 如果奇数下标的排序结果不符合预期,则无法通过交换操作将数组排序,返回-1。
- 奇数下标的元素在最终的升序排列中应该是奇数序列,即
逆序数计算:
- 分别计算奇数下标和偶数下标部分的逆序数。
- 逆序数代表需要多少次交换才能使该部分有序。
- 总交换次数为奇数下标和偶数下标部分的逆序数之和。
代码实现
1 |
|
复杂度分析
- 时间复杂度:O(n²),主要由逆序数的双重循环计算决定。(可以用树状数组求解逆序对,时间复杂度为 O(nlogn))
- 空间复杂度:O(n),用于存储奇数和偶数下标的元素。
213小R的排列挑战
https://kongshuilinhua.github.io/2024/12/25/213小R的排列挑战/