题目描述
给定一个非负整数数组 A
,返回一个由 A
的所有偶数元素组成的数组,后面跟 A
的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
样例
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
注意
1 <= A.length <= 5000
0 <= A[i] <= 5000
算法
(双指针扫描) $O(n)$
- 定义两个指针 l 和 r,初始时 l = 0, r = n - 1。
- 当 l 和 r 没有相遇时,找到下一个 A[l] 为奇数的位置,再找到下一个 A[r] 为偶数的位置;交换这两个位置上的数字。
时间复杂度
- 每个数字仅被访问一次,故时间复杂度为 $O(n)$。
空间复杂度
- 原地算法,仅用了常数的空间。
C++ 代码
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
int n = A.size();
int l = 0, r = n - 1;
while (l < r) {
while (l < r && (A[l] & 1) == 0) l++;
while (l < r && (A[r] & 1) == 1) r--;
if (l < r) {
swap(A[l], A[r]);
l++;
r--;
}
}
return A;
}
};