方法一 两次遍历
时间复杂度O(N)
遍历一遍数组把所有的偶数放进 ans[0],ans[2],ans[4],依次类推。
再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],依次类推。
class Solution {
public int[] sortArrayByParityII(int[] A) {
int n = A.length;
int[] A_new = new int[n];
int i = 0, j = 1;
for (int x : A){
if ( x % 2 == 0){
A_new[i] = x;
i += 2;
}
if ( x % 2 == 1){
A_new[j] = x;
j += 2;
}
}
return A_new;
}
}
方法二 双指针
时间复杂度O(N)
为数组的偶数下标部分和奇数下标部分分别维护指针 i, ji,j。随后,在每一步中,如果 A[i]A[i] 为奇数,则不断地向前移动 jj(每次移动两个单位),直到遇见下一个偶数。此时,可以直接将 A[i]A[i] 与 A[j]A[j] 交换。我们不断进行这样的过程,最终能够将所有的整数放在正确的位置上。
class Solution {
public int[] sortArrayByParityII(int[] A) {
int j = 1;
for (int i = 0; i < A.length; i+=2){
if (A[i] % 2 == 1){
while (A[j] % 2 == 1){
j+=2;
}
swap(A, i, j);
}
}
return A;
}
public void swap(int[] array, int x, int y){
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}
}
日期
2020-11-12