输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
方法1:不要求稳定性:用前后指针分别指向偶数、奇数,然后数字互换
(时间复杂度:O(n),空间复杂度:O(1))
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int len=nums.size();
int temp=0,i=0,j=len-1;
while(i<j)
{
while((nums[i]%2!=0)&&(i<j))//必须加判断 i<j,不然会越界
{
i++;
}
while((nums[j]%2==0)&&(i<j))//必须加判断 i<j,不然会越界
{
j--;
}
if((nums[i]%2==0)&&(nums[j]%2!=0))
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
}
return nums;
}
};
方法2:要求稳定性:(时间复杂度为O())
/*
1.i 从左到右开始遍历,找到第一个偶数;
2.j 从 i+1 开始向后找,直到找到第一个奇数;
3.将 [ i , ... . j - 1 ] 的元素整体后移一位,最后将找到的奇数放入 i 位置,然后 i++;
4.终止条件,j 向后遍历查找失败,即后面没有奇数了
*/
//还可以用冒泡或者直接插入的方法
vector<int> reOrderArray(vector<int>& array)
{
int len=array.size();
int i=0,j=0;
int temp=0;
while(i<len)
{
while(i<len&&array[i]%2!=0)
{
i++;
}
j=i+1;
while(j<len&&array[j]%2==0)
{
j++;
}
if(j<len)
{
temp=array[j];//必须是往后移动,否则会位置发动变化
for(int q=j;q>i;q--)
{
array[q]=array[q-1];
}
array[i]=temp;
}
else
break; 必须有
}
return array;
}
方法3: 要求稳定性:(时间复杂度O(n))
//用空间换时间
//首先统计奇数的个数,然后新建一个与原数组等长的数组,设置两个指针,
//奇数指针从0开始,偶数指针从奇数个数的末尾开始遍历填数。
vector<int> reOrderArray(vector<int>& array)
{
int len=array.size();
int num=0;
int *result=new int[len];//声明动态数组
int j=0,o=len;
vector<int> r;
for(int i=0;i<len;i++)
{
if(array[i]%2!=0)
{
num++;
}
}
o=num;
for(int i=0;i<len;i++)
{
if(array[i]%2!=0)
{ if(j<num)
{
result[j]=array[i];
j++;
}
}
else
{
if(o<len)
{
result[o]=array[i];
o++;
}
}
}
for(int i=0;i<len;i++)
{
r.push_back(result[i]);
}
return r;
}