题目要求
时间限制:1秒 空间限制:32768K
本题知识点: 数组
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
实现思路
解法一
首先想到的是利用两个辅助数组,一个保存奇数,一个保存偶数,这样的解法空间复杂度为O(n),时间复杂度为O(n)。代码如下:
class Solution {
public:
void reOrderArray(vector<int> &array) {
//使用两个辅助数组
vector<int>odd;//保存奇数
vector<int>even;//保存偶数
for(int i=0;i<array.size();++i){
if(array[i]%2==1)odd.push_back(array[i]);
else even.push_back(array[i]);
}
array.clear();
for(int i=0;i<odd.size();++i){
array.push_back(odd[i]);
}
for(int i=0;i<even.size();++i){
array.push_back(even[i]);
}
}
};
改进
上面的方法使用了两个辅助数组,实际上使用一个数组即可。改进后的代码如下:
class Solution {
public:
void reOrderArray(vector<int> &array) {
//使用一个辅助数组
vector<int>new_array;
for(int i=0;i<array.size();++i){
if(array[i]%2==1)new_array.push_back(array[i]);
}
for(int i=0;i<array.size();++i){
if(array[i]%2==0)new_array.push_back(array[i]);
}
array=new_array;
}
};
解法二
不使用额外的辅助空间,采用类似于插入排序的方法,时间复杂度为O(n2)
class Solution {
public:
void reOrderArray(vector<int> &array) {
//不使用辅助数组
for(int i=0;i<array.size();++i){
if(array[i]%2==1){
int temp=array[i];
int j=i-1;
while(j>=0&&array[j]%2==0){
array[j+1]=array[j];
--j;
}
array[j+1]=temp;
}
}
}
};