解题思路:两种方法。第一种:如果可以使用额外的空间的话,可以将数组复制,然后计算数组中元素是奇数的个数,然后两个指针i,j分别指向奇数位置和偶数位置。时间复杂度为O(2n),空间复杂度为O(n)。
public class Solution {
public void reOrderArray(int [] array) {
if(array==null || array.length==0)
return;
int[] copyArr = array.clone();
int cnt = 0;
for(int i=0;i<array.length;i++){
if(array[i]%2!=0)
cnt++;
}
int i=0,j=cnt;
for(int num:copyArr){
if(num%2==0)
array[j++] = num;
else
array[i++] = num;
}
}
}
第二种是不借助额外空间,扫描数组元素,当元素是奇数时,从当前位置往前扫描,相邻位置两两交换(类似冒泡排序),直到元素为偶数停止,时间复杂度为O(n^2),空间复杂度为O(1)。
public class Solution {
public void reOrderArray(int [] array) {
if(array==null || array.length==0)
return;
for(int i=0;i<array.length;i++){
if(array[i]%2!=0){
int tmp = array[i];
int j=i-1;
while(j>=0&&array[j]%2==0){
array[j+1] = array[j];
j--;
}
array[j+1] = tmp;
}
}
}
}