题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
遇偶寻奇
i表示当前指针,j=i+1表示后一个指针
核心思路: 如果array[i]为偶数,j向后寻找第一个奇数,奇数前插入,偶数整体部分后移。
每遇到一个偶数后的第一个奇数,就移动偶数,插入奇数,最坏的情况n/2个偶数移动n/2次。
时间复杂度O(n2), 空间复杂度O(1)。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
int i = 0, j;
while (i < len)
{
int j = i + 1;
if ((array[i] & 1) == 0)
{
while (j < len && (array[j] & 1) == 0)
{
j++;
}
if (j == len)
{
return ;
}
int tmp = array[j];
for (int k = j; k > i; --k)
{
array[k] = array[k-1];
}
array[i] = tmp;
}
++i;
}
}
};
空间换时间
遍历将奇数放进vector1,偶数放进vector2,再将vector1,vector2赋给array。
时间复杂度O(n),空间复杂度O(n)。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
vector<int> a, b;
for (int i = 0; i < len; ++i)
{
if ((array[i] & 1) != 0)
{
a.push_back(array[i]);
}
else
{
b.push_back(array[i]);
}
}
int len_a = a.size();
int len_b = b.size();
for (int i = 0; i < len_a; ++i)
{
array[i] = a[i];
}
for (int i = 0; i < len_b; ++i)
{
array[len_a + i] = b[i];
}
}
};