var sortArrayByParityII = function(nums) { const n = nums.length; const ans = newArray(n); let i = 0; for (const x of nums) { if (!(x & 1)) { ans[i] = x; i += 2; } }
i = 1; for (const x of nums) { if (x & 1) { ans[i] = x; i += 2; } }
return ans; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
funcsortArrayByParityII(nums []int) []int { ans := make([]int, len(nums)) i := 0 for _, v := range nums { if v%2 == 0 { ans[i] = v i += 2 } } i = 1 for _, v := range nums { if v%2 == 1 { ans[i] = v i += 2 } } return ans }
复杂度分析
时间复杂度:O(N),其中 N 是数组 nums 的长度。
空间复杂度:O(1)。注意在这里我们不考虑输出数组的空间占用。
方法二:双指针
思路与算法
如果原数组可以修改,则可以使用就地算法求解。
为数组的偶数下标部分和奇数下标部分分别维护指针 i, j。随后,在每一步中,如果 nums}[i] 为奇数,则不断地向前移动 j(每次移动两个单位),直到遇见下一个偶数。此时,可以直接将 nums}[i] 与 nums}[j] 交换。我们不断进行这样的过程,最终能够将所有的整数放在正确的位置上。
[sol2-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: vector<int> sortArrayByParityII(vector<int>& nums){ int n = nums.size(); int j = 1; for (int i = 0; i < n; i += 2) { if (nums[i] % 2 == 1) { while (nums[j] % 2 == 1) { j += 2; } swap(nums[i], nums[j]); } } return nums; } };