所有偶数位于偶数索引位置(索引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),只使用了常数级别的额外空间
忘记检查指针越界条件
交换前没有验证指针有效性
错误理解奇偶索引和数值奇偶性的关系
来源:大矩学习资料