【剑指offer】69.调整数组顺序使奇数位于偶数前面(二)

总目录:

算法之旅导航目录

 

1.问题描述

输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。
数据范围:0≤n≤50000,数组中每个数的值 0≤val≤10000
要求:时间复杂度 O(n),空间复杂度 O(1)

 

2.问题分析

 将发现的奇数与已知最靠前的偶数作比较,如果偶数比较靠前则交换二者位置。

1双指针

用2个指针分别维护最新发现的奇数的位置和最早发现的偶数的位置,当2个指针都不为空时进行比较、交换。

交换之后,偶数指针+1,奇数指针清空等待再次找到奇数。


3.代码实例

双指针

 1 class Solution {
 2   public:
 3     /**
 4      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 5      *
 6      *
 7      * @param array int整型vector
 8      * @return int整型vector
 9      */
10     vector<int> reOrderArrayTwo(vector<int>& array) {
11         int dataLen = array.size();
12         int lastOdd = -1;//已遍历区域中最后一个奇数的坐标
13         int firstEven = -1;//已遍历区域中第一个偶数的坐标
14 
15         for (int i = 0; i < dataLen; i++) {
16             if (array[i] % 2 != 0) {//奇数
17                 lastOdd = i;
18             } else {
19                 if (firstEven < 0) {//偶数
20                     firstEven = i;
21                 }
22             }
23 
24             //奇数、偶数都已知,且奇数靠后
25             if (lastOdd >= 0 && firstEven >= 0 && lastOdd > firstEven) {
26                 swap(array[lastOdd], array[firstEven]);
27                 lastOdd = -1;//奇数重置,需要重新寻找
28                 firstEven++;//偶数向后走1步
29             }
30         }
31 
32         return array;
33     };
34 };

 

posted @ 2022-12-05 20:54  啊原来是这样呀  阅读(19)  评论(0编辑  收藏  举报