
一、问题理解
- 所有偶数位于偶数索引位置(索引0,2,4...)
- 所有奇数位于奇数索引位置(索引1,3,5...)
- 不要求数字本身的排序,只需满足奇偶位置正确
二、解法思路
even
指针:负责扫描偶数索引位置odd
指针:负责扫描奇数索引位置
当发现偶数索引位置是奇数,且奇数索引位置是偶数时,交换这两个位置的元素。
三、完整代码解析
C++
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& nums) {
int n = nums.size();
int even = 0; // 偶数指针,初始指向第一个偶数位置(索引0)
int odd = 1; // 奇数指针,初始指向第一个奇数位置(索引1)
while (even < n && odd < n) {
// 找到偶数位置上不是偶数的元素
while (even < n && nums[even] % 2 == 0) {
even += 2;
}
// 找到奇数位置上不是奇数的元素
while (odd < n && nums[odd] % 2 == 1) {
odd += 2;
}
// 交换这两个位置上的元素
if (even < n && odd < n) {
swap(nums[even], nums[odd]);
}
}
return nums;
}
};
四、代码逐行解析
even
和odd
指针初始化:分别指向第一个偶数和奇数索引位置- 外层
while
循环:确保两个指针都在数组范围内 - 第一个内层
while
:跳过已经正确的偶数位置(即该位置已经是偶数) - 第二个内层
while
:跳过已经正确的奇数位置(即该位置已经是奇数) swap
操作:交换不满足条件的两个位置的元素
五、时间复杂度分析
- 时间复杂度:O(n),每个元素最多被访问一次
- 空间复杂度:O(1),只使用了常数级别的额外空间
六、常见错误
- 忘记检查指针越界条件
- 交换前没有验证指针有效性
- 错误理解奇偶索引和数值奇偶性的关系
来源:大矩学习资料