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