一、题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
二、解题思路
1. 冒泡思想
每次都当前偶数上浮到当前最右边,时间换空间。
时间复杂度: O(n^2),其中n为数组的长度
空间复杂度: O(1)
【C++】
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
if(!len) return;
for(int i=0; i<len; i++) {
for(int j=len-1; j>i; j--) {
if(array[j]%2 == 1 && array[j-1]%2 == 0) swap(array[j], array[j-1]);
}
}
}
};
//优化:如果扫描一次后未曾交换数据,表明所有数据已经归位,直接跳出
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(!array.size()) return;
int len = array.size(), i, j, flag;
for(i=0, flag=0; i<len, flag==0; i++) {
for(j=len-1, flag=1; j>i; j--) {
if(array[j]%2 == 1 && array[j-1]%2 == 0) {
swap(array[j], array[j-1]);
flag = 0;
}
}
}
}
};
2. 双指针
- 时间复杂度:O(n),其中n为数组的长度,遍历2次数组
- 空间复杂度:O(1),res数组属于返回函数必要数组,不算额外空间
【C++】
class Solution {
public:
vector<int> reOrderArray(vector<int>& array) {
int len = array.size();
vector<int> res(len);
int odd = 0;
for (int i = 0; i < len; i++) {
if (array[i] % 2 == 1) {
odd++;
}
}
int x = 0;
int y = odd;
for (int i = 0; i < len; i++) {
array[i] % 2 == 1 ? res[x++] = array[i] : res[y++] = array[i];
}
return res;
}
};
【Java】
import java.util.*;
public class Solution {
public int[] reOrderArray (int[] array) {
int len = array.length;
int[] res = new int[len];
int odd = 0;
for (int i = 0; i < len; i++) {
if (array[i] % 2 == 1) {
odd++;
}
}
int x = 0;
int y = odd;
for (int i = 0; i < len; i++) {
if (array[i] % 2 == 1) {
res[x++] = array[i];
} else {
res[y++] = array[i];
}
}
return res;
}
}
三、相关题目
《剑指offer》22--链表中倒数第 K 个结点[C++][Java]