题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
思路一
从前往后扫描数组,遇到一个偶数就把它放到数组末尾,并且把之后的数字往前挪,这也会改变奇数与偶数的相对位置
时间复杂度O(n2)
1 2 3 4 5 6 7
1 3 4 5 6 7 2
1 3 5 6 7 2 4
1 3 5 7 2 4 6
1 3 5 7 4 6 2
1 3 5 7 4 2 6
问题就是出在,当满足奇数在偶数前面之后,还对偶数部分进行了操作
解决方案:先统计出偶数个数n,然后进行后插n次停止即可。
扫描二维码关注公众号,回复:
2266210 查看本文章
class Solution { public: void reOrderArray(vector<int> &array) { if (array.size() == 0) return; int length = array.size(), count = 0; for (int i = 0; i < length; i++) if (array[i] % 2 == 0) count++; int i = 0; while (i < length && count){ if (array[i] % 2 == 1) i++; else if (array[i] % 2 == 0) { int temp = array[i]; for (int j = i; j < length - 1; j++) array[j] = array[j+1]; array[length-1] = temp; count--; } } } };
思路二
在数组头和数组尾设置两个指针,当第一个指针指向偶数,第二个指针指向奇数,则交换他们的位置,时间复杂度O(n)
但是这会改变奇数与偶数的相对位置
1 2 3 4 5 -> 1 5 3 4 2
class Solution { public: void reOrderArray(vector<int> &array) { if (array.size() == 0 ) return; int p1 = 0, p2 = array.size() - 1; while (p1 <= p2) { while (p1 <= p2 && (array[p1] % 2 == 1)) p1++; while (p1 <= p2 && (array[p2] % 2 == 0)) p2--; if (p1 <= p2){ int temp = array[p2]; array[p2] = array[p1]; array[p1] = temp; } } } };