题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:要保持奇数和偶数的相对位置不变并且达到O(n)的时间复杂度的话,必须要用O(n)的辅助空间。
1 class Solution { 2 public: 3 void reverseArray(vector<int> &array, int begin) 4 { 5 int end=array.size()-1; 6 while(begin<end) 7 { 8 int tmp=array[begin]; 9 array[begin]=array[end]; 10 array[end]=tmp; 11 ++begin; 12 --end; 13 } 14 } 15 void reOrderArray(vector<int> &array) 16 { 17 if(array.size()<=1)return; 18 vector<int> tmp=array; 19 int left=0, right=array.size()-1; 20 for(int i=0; i<tmp.size(); ++i) 21 { 22 if(tmp[i] & 1)array[left++]=tmp[i]; 23 else array[right--]=tmp[i]; 24 } 25 reverseArray(array, right+1);//将偶数部分逆序 26 } 27 };
不使用辅助空间的话,只能实现O(n^2)的时间复杂度。首先寻找第一个奇数,并将其放在0号位置。然后将第一个奇数之前的元素全部往后移一位。然后在第一个奇数之后的元素中寻找奇数,并做移动操作。就可以保证原来的相对顺序。
1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) 4 { 5 if(array.size()<=1)return; 6 for(int i=0; i<array.size(); ++i) 7 { 8 int j=i; 9 while(!(array[j] & 1) && j<array.size())++j; 10 if(j==array.size())return; 11 int tmp=array[j]; 12 while(j>i) 13 { 14 array[j]=array[j-1]; 15 --j; 16 } 17 array[i]=tmp; 18 } 19 } 20 };