双指针法解决力扣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),只使用了常数级别的额外空间
六、常见错误
忘记检查指针越界条件
交换前没有验证指针有效性
错误理解奇偶索引和数值奇偶性的关系
七、扩展思考
可以尝试修改算法,使其在保持奇偶位置正确的同时,还能保证数字本身的升序排列。
原创内容 转载请注明出处