Sort Array By Parity II
Even-valued at even indices, odd-valued at odd indices — two interleaved pointers.
3 min read
cyclic-sort two-pointers
Problem#
Rearrange nums so that even values sit at even indices and odd values at odd indices.
Examples#
[4,2,5,7]→[4,5,2,7]
Constraints#
2 <= n <= 2 * 10^4, half even half odd.
Approach#
Two pointers e = 0 (even index), o = 1 (odd index). Advance e while nums[e] is even; advance o while nums[o] is odd. Swap when both are misplaced.
Solution#
class Solution {public: vector<int> sortArrayByParityII(vector<int>& nums) { int e = 0, o = 1, n = nums.size(); while (e < n && o < n) { if (nums[e] % 2 == 0) e += 2; else if (nums[o] % 2 == 1) o += 2; else { swap(nums[e], nums[o]); e += 2; o += 2; } } return nums; }};func sortArrayByParityII(nums []int) []int { e, o, n := 0, 1, len(nums) for e < n && o < n { if nums[e]%2 == 0 { e += 2 } else if nums[o]%2 == 1 { o += 2 } else { nums[e], nums[o] = nums[o], nums[e] e += 2 o += 2 } } return nums}from typing import List
class Solution: def sortArrayByParityII(self, nums: List[int]) -> List[int]: e, o, n = 0, 1, len(nums) while e < n and o < n: if nums[e] % 2 == 0: e += 2 elif nums[o] % 2 == 1: o += 2 else: nums[e], nums[o] = nums[o], nums[e] e += 2 o += 2 return numsfunction sortArrayByParityII(nums) { let e = 0, o = 1; const n = nums.length; while (e < n && o < n) { if (nums[e] % 2 === 0) e += 2; else if (nums[o] % 2 === 1) o += 2; else { [nums[e], nums[o]] = [nums[o], nums[e]]; e += 2; o += 2; } } return nums;}class Solution { public int[] sortArrayByParityII(int[] nums) { int e = 0, o = 1, n = nums.length; while (e < n && o < n) { if (nums[e] % 2 == 0) { e += 2; } else if (nums[o] % 2 == 1) { o += 2; } else { int tmp = nums[e]; nums[e] = nums[o]; nums[o] = tmp; e += 2; o += 2; } } return nums; }}function sortArrayByParityII(nums: number[]): number[] { let e = 0, o = 1; const n = nums.length; while (e < n && o < n) { if (nums[e] % 2 === 0) e += 2; else if (nums[o] % 2 === 1) o += 2; else { [nums[e], nums[o]] = [nums[o], nums[e]]; e += 2; o += 2; } } return nums;}Editorial#
Each swap fixes two cells simultaneously. The two-pointer walk costs O(n).
Complexity#
- Time: O(n).
- Space: O(1).
Concept revision#
Related#