题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
看着这个题目,想到的是排序算法。(推荐这个)
以及利用空间换时间,新建数组的算法。
先说这个新建数组的算法,思路简单。就是将奇数和偶数分别计算出来放在新的数组里,再把新的数组给旧数组。
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> a,b;
for(int i=0;i<array.size();i++)
{
if(array[i]%2!=0)
a.push_back(array[i]);
else
b.push_back(array[i]);
}
a.insert(a.end(),b.begin(),b.end());
array=a;
}
};
这里时间复杂度是O(n),空间复杂度也是O(n)。就是利用消耗空间来换取时间。但是后来想到,既然题目用到了引用,应该是希望我们尽量在原数组array上进行修改,所以比较推荐排序算法。
方法二:插入排序
题目中提到相对位置不变,因此考虑用的是插入排序的思想。
当这个数是奇数时,记录在temp中,如果前面有偶数,就往这个数前插入。这样也能保持了原本的顺序
这个时间复杂度O(n^2),空间复杂度是O(1)。
class Solution {
public:
void reOrderArray(vector<int> &array) {
for(int i=1;i<array.size();i++)
{
if(array[i]%2==1){
int temp = array[i];
int j;
for(j=i;j>0&&array[j-1]%2==0;j--)
array[j]=array[j-1];
array[j]=temp;
}
}
}
};
后来想到好像还可以用,检测这个数是否偶数,是偶数就先在数组中删除,再在末尾push_back。没有具体测试过,在Python上应该比较好实现。