给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
方法一:使用两个数组存储奇数和偶数
时间复杂度:O(N)
空间复杂度:O(N)
class Solution {
public int[] sortArrayByParity(int[] A) {
ArrayList<Integer> odd = new ArrayList<>();
ArrayList<Integer> even = new ArrayList<>();
for(int i = 0; i < A.length; i++){
if(A[i] % 2 == 0){
even.add(A[i]);
}
else{
odd.add(A[i]);
}
}
even.addAll(odd);
for(int i = 0; i < A.length; i++){
A[i] = even.get(i);
}
return A;
}
}
两遍扫描
时间复杂度:O(N)
空间复杂度:O(N)
class Solution {
public int[] sortArrayByParity(int[] A) {
int[] ans = new int[A.length];
int t = 0;
for (int i = 0; i < A.length; ++i)
if (A[i] % 2 == 0)
ans[t++] = A[i];
for (int i = 0; i < A.length; ++i)
if (A[i] % 2 == 1)
ans[t++] = A[i];
return ans;
}
}
原地排序
维护两个指针i和j,循环保证每个时刻小于i的变量都是偶数,所有大于j的都是奇数
时间复杂度:O(N)
空间复杂度:O(1)
class Solution {
public int[] sortArrayByParity(int[] A) {
int i = 0;
int j = A.length - 1;
while(i < j){
if((A[i] % 2) > (A[j] % 2)){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
if(A[i] % 2 == 0) i++;
if(A[j] % 2 == 1) j--;
}
return A;
}
}