给你一个由互不相同的整数组成的数组 nums。 在一次操作中,你可以交换任意两个相邻元素。 在一...
생성일: 2025년 6월 21일
생성일: 2025년 6월 21일
给你一个由互不相同的整数组成的数组 nums。
在一次操作中,你可以交换任意两个相邻元素。
在一个排列中,当所有相邻元素的奇偶性交替出现,我们认为该排列是 有效排列。这意味着每对相邻元素中一个是偶数,一个是奇数。
请返回将 nums 变成任意一种有效排列所需的最小相邻交换次数。
如果无法重排 nums 来获得有效排列,则返回 -1。
示例 1:
输入: nums = [2,4,6,5,7]
输出:3
解释:
将 5 和 6 交换,数组变成 [2,4,5,6,7]
将 5 和 4交换,数组变成 [2,5,4,6,7]
将 6和 7交换,数组变成[2,5,4,7,6]。此时是一个有效排列。因此答案是 3。
示例 2:
输入: nums = [2,4,5,7]
输出: 1
解释:
将 4和 5交换,数组变成 [2,5,4,7]。此时是一个有效排列。因此答案是 1。
示例 3:
输入: nums = [1,2,3]
输出: 0
解释:
数组已经是有效排列,因此不需要任何操作。
示例 4:
输入:nums = [4,5,6,8]
输出:-1
解释:
没有任何一种排列可以满足奇偶交替的要求,因此返回 -1。
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
nums中的所有元素都是 唯一 的
class Solution {
public int minSwaps(int[] nums) {
}
} 解决这个问题,通过所有例子,并且不能超时
思路解析
合法性判断
evenCnt
、oddCnt
为偶数/奇数个数。记录原始下标
nums
,把偶数出现的下标存到 evenPos
,奇数出现的下标存到 oddPos
。枚举起始奇偶性
evenCnt == oddCnt
,既可以 “偶-奇-偶-奇…” 也可以 “奇-偶-奇-偶…”,两种都要算,取较小者。evenCnt > oddCnt
(只可能多 1 个),排列必须从偶数开头;反之亦然。计算最少相邻交换次数
target[i] = 2*i
为第 i
个该类元素理应出现的位置,下标差的绝对值就是它要走的步数;相邻交换一次只能把元素移动 1 位,所以
复杂度
n ≤ 10^5
,步数上界约 ,用 long
保存再强转 int
安全无误。javaclass Solution { public int minSwaps(int[] nums) { int n = nums.length; List<Integer> evenPos = new ArrayList<>(); List<Integer> oddPos = new ArrayList<>(); for (int i = 0; i < n; ++i) { if ((nums[i] & 1) == 0) { evenPos.add(i); } else { oddPos.add(i); } } int evenCnt = evenPos.size(), oddCnt = oddPos.size(); if (Math.abs(evenCnt - oddCnt) > 1) return -1; // 无解 long ans = Long.MAX_VALUE; // 情况 A: 以偶数开头 (偶数占 0,2,4,...) if (evenCnt >= oddCnt) { long cost = 0; for (int i = 0; i < evenPos.size(); ++i) { cost += Math.abs(evenPos.get(i) - (long)(2 * i)); } ans = Math.min(ans, cost); } // 情况 B: 以奇数开头 (奇数占 0,2,4,...) if (oddCnt >= evenCnt) { long cost = 0; for (int i = 0; i < oddPos.size(); ++i) { cost += Math.abs(oddPos.get(i) - (long)(2 * i)); } ans = Math.min(ans, cost); } return (int) ans; // 上限 1.25e9,fits in int } }
例子核对
输入 | 计算过程 | 输出 |
---|---|---|
[2,4,6,5,7] | 仅可偶数开头: $ | 0-0 |
[2,4,5,7] | 偶数开头得 1,奇数开头得 3 ⇒ 取 1 | 1 |
[1,2,3] | 只能奇数开头,代价 0 | 0 |
[4,5,6,8] | |even-odd| = 2 > 1 ⇒ -1 | -1 |
全部符合题意且 O(n) 通过大数据不会超时。