解题思路:用快排的思想
(双指针扫描) O(n)O(n)
用两个指针分别从首尾开始,往中间扫描。扫描时保证第一个指针前面的数都是奇数,第二个指针后面的数都是偶数。
每次迭代时需要进行的操作:
第一个指针一直往后走,直到遇到第一个偶数为止;
第二个指针一直往前走,直到遇到第一个奇数为止;
交换两个指针指向的位置上的数,再进入下一层迭代,直到两个指针相遇为止;
/*
* 2个指针,一个从前往后,遍历元素是不是奇数。不满足条件跳出while循环,输出当前
* 元素的下标i
* 一个从后往前查元素是不是偶数。不满足条件跳出while循环,输出当前元素的下标j
* 当两个while都不执行的时候,进行数组元素的交换。
*
* /
class Solution {
public:
void reOrderArray(vector<int> &array) {
int l = 0, r = array.size() - 1;
while (l < r) {
while (l < r && array[l] % 2 == 1) l ++ ;
while (l < r && array[r] % 2 == 0) r -- ;
if (l < r) swap(array[l], array[r]);
}
}
};
作者:yxc
链接:https://www.acwing.com/solution/acwing/content/738/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
牛客网
题解:
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网
思路:参考快速排序
i++
往前走碰到偶数停下来,j = i+1
- 若
a[j]
为偶数,j++
前进,直到碰到奇数a[j]
对应的奇数插到a[i]位置,j
经过的j-i
个偶数依次后移
- 如果
j==len-1
时还没碰到奇数,证明i
和j
之间都为偶数了,完成整个移动 -
参考代码:
-
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion 来源:牛客网 class Solution { public: void reOrderArray(vector<int> &array) { int len = array.size(); if(len <= 1){ // 数组空或长度为1 return; } int i = 0; while(i < len){ int j = i + 1; if(array[i]%2 == 0){ // a[i]为偶数,j前进,直到替换 while(array[j]%2 == 0){ // j为偶数,前进 if(j==len-1)// i为偶数,j也为偶数,一直后移到了末尾,证明后面都是偶数 return; j++; } // 此时j为奇数 int count = j-i; int temp = array[i]; array[i] = array[j]; while(count>1){ array[i+count] = array[i+count-1];//数组后移 count--; } array[i+1] = temp; } i++; } } };
自己:
-
class Solution { public: void reOrderArray(vector<int> &array) { int i = 0 ,j = 0,n = array.size()-1,count = 0, temp; if(n+1 <= 1) return; while(i <= n) { j = i + 1; if(array[i]%2 == 0) { while(j <= n && array[j]%2 == 0) j++; if(j > n) return; else { temp = array[i]; swap(array[i], array[j]); } //数组后移 for(int k = j-1; k >= i+1 ;k--) { array[k+1] = array[k]; } array[i+1] = temp; } else i++; } } };