题意思路:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:暴力枚举
遍历一遍数组顺序,使数组中奇数分为一类,偶数分为一类,最后将奇数位于偶数前面
复杂度分析
时间复杂度:O(N),N数组的长度,遍历数组;
空间复杂度:O(N),数组存储与读取数据。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArray(vector<int>& array) {
// write code here
vector<int>evenArray;
vector<int>oddArray;
vector<int>res;
for(int i:array){
if(i&1){//使数组中奇数分为一类,偶数分为一类
oddArray.push_back(i);
}
else evenArray.push_back(i);
}
for(int i:oddArray)res.push_back(i);//最后将奇数位于偶数前面
for(int i:evenArray)res.push_back(i);
return res;
}
};方法二:双指针
创建双指针i和j
i = 0表示没有一个奇数,j 表示数组的下标,对数组进行遍历
若指针j指向偶数继续遍历
若指针j指向奇数则整体偶数向后移动,将该奇数赋值给i指针位置,i++,j++。
图解:
复杂度分析
时间复杂度:O(N^2),N数组的长度,遍历数组,整体后移最坏情况下时间复杂度N^2;
空间复杂度:O(1),未开辟新空间
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArray(vector<int>& array) {
// write code here
int i=0,j=0;//i表示奇数,j表示数组当前下标
for(;j<array.size();){
if((array[j]&1)==0)j++;//若为偶数指针j后移
else{//若为奇数
int tmp=array[j];
for(int k=j-1;k>=i;k--){//将前面的偶数向后移动
array[k+1]=array[k];
}
array[i++]=tmp; //将奇数调换到i处
j++;
}
}
return array;
}
};
京公网安备 11010502036488号