【剑指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 };

 

posted @ 2022-12-06 10:38  啊原来是这样呀  阅读(27)  评论(0)    收藏  举报