双指针法解决力扣922题:按奇偶排序数组II的完整指南

一、问题理解
所有偶数位于偶数索引位置(索引0,2,4...)
所有奇数位于奇数索引位置(索引1,3,5...)
不要求数字本身的排序,只需满足奇偶位置正确
二、解法思路
even指针:负责扫描偶数索引位置odd指针:负责扫描奇数索引位置
当发现偶数索引位置是奇数,且奇数索引位置是偶数时,交换这两个位置的元素。
三、完整代码解析
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),只使用了常数级别的额外空间
六、常见错误
忘记检查指针越界条件
交换前没有验证指针有效性
错误理解奇偶索引和数值奇偶性的关系
七、扩展思考
可以尝试修改算法,使其在保持奇偶位置正确的同时,还能保证数字本身的升序排列。
原创内容 转载请注明出处
