描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
这道题我能想到的方法时间复杂度最小为O(n),想了一下,应该也没有其他时间复杂度更小的方法了,具体有两种思路:
思路1:
再开一个vector容器,遍历两次,第一次保存奇数列,第二次保存偶数列,最后再赋值,有点空间换时间的思想,具体代码如下:
class Solution {
public:
void reOrderArray(vector<int> &array) {
int n = array.size();
vector<int> tem;
for(int i = 0; i < n; i++) {
if(array[i] % 2 == 1) {
tem.push_back(array[i]);
}
}
for(int i = 0; i < n; i++) {
if(array[i] % 2 == 0) {
tem.push_back(array[i]);
}
}
for(int i = 0; i < n; i++) {
array[i] = tem[i];
}
}
};
思路2:
一次遍历,先把偶数从数组中删除掉,然后再从尾部插入,这样看起来时间复杂度和空间复杂度都很小。
不过使用这种方法吧涉及vector容器的删除操作,所以推荐使用迭代器来实现,因为使用迭代器来删除会自动指向数组的下一个元素,使用下标运算的话感觉稍不注意就容易出错,具体代码如下:
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int>::iterator even = array.begin();
int n = array.size();
int tem = 0;
while(n > 0) {
if (*even % 2 == 0) {
tem = *even;
even = array.erase(even);
array.push_back(tem);
} else {
even++;
}
n--;
}
}
};