题意思路:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:暴力枚举
遍历一遍数组顺序,使数组中奇数分为一类,偶数分为一类,最后将奇数位于偶数前面
复杂度分析
时间复杂度: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; } };