【剑指offer】70.调整数组顺序使奇数位于偶数前面(一)
总目录:
1.问题描述
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:0≤n≤5000,数组中每个数的值 0≤val≤10000
要求:时间复杂度 O(n),空间复杂度 O(n)
进阶:时间复杂度 O(n^2),空间复杂度 O(1)
2.问题分析
注意要求保持奇数和奇数、偶数和偶数之间的相对位置关系不变。
1双指针法
先遍历一遍统计奇数和偶数的个数,获得偶数存放的起始位置为oddCnt-1,然后再遍历一遍奇数放在奇数区、偶数放在偶数区
2冒泡法
正向遍历,遇到奇数则反向冒泡,冒泡到遇到前一个奇数或到头
3.代码实例
双指针
1 class Solution { 2 public: 3 vector<int> reOrderArray(vector<int>& array) { 4 int dataLen = array.size(); 5 vector<int> ret(dataLen, 0); 6 int oddCnt = 0; 7 8 //奇偶计数 9 for (int i = 0; i < dataLen; i++) { 10 if (array[i] % 2 != 0) { 11 oddCnt++; 12 } 13 } 14 15 //奇数存储在0~oddCnt-1中,偶数存储在oddnt~dataen-1中 16 int curOddId = 0, curEvenId = oddCnt; 17 for (int i = 0; i < dataLen; i++) { 18 if (array[i] % 2 != 0) { 19 ret[curOddId++] = array[i]; 20 } else { 21 ret[curEvenId++] = array[i]; 22 } 23 } 24 25 return ret; 26 } 27 };
冒泡
1 class Solution { 2 public: 3 vector<int> reOrderArray(vector<int>& array) { 4 int dataLen = array.size(); 5 6 for (int i = 0; i < dataLen; i++) { 7 //忽略偶数 8 if (array[i] % 2 == 0) { 9 continue; 10 } 11 12 //将奇数向前冒泡,直到遇到奇数或到头 13 for (int j = i; j > 0; j--) { 14 //如果前一个是奇数,则停止冒泡 15 if (array[j - 1] % 2 != 0) { 16 break; 17 } 18 19 swap(array[j], array[j - 1]); 20 } 21 } 22 23 return array; 24 } 25 };
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号