NC77 调整数组顺序使奇数位于偶数前面
给出一个长度为 n n n 的数组 a r r arr arr,将其中的奇数调整至所有偶数的前面,并要求奇偶性相同的数字之间的相对次序不变。
比如,输入为 [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4],输出为 [ 1 , 3 , 2 , 4 ] [1,3,2,4] [1,3,2,4]。不能输出 [ 3 , 1 , 2 , 4 ] [3,1,2,4] [3,1,2,4],因为 1 和 3 的相对位置变了。
一个比较直观的思路是排序,将奇偶性作为比较条件,奇优于偶。借助库函数 std::stable_sort
可以很轻松的完成这道题。
class Solution {
public:
vector<int> reOrderArray(vector<int>& array) {
std::stable_sort(array.begin(), array.end(), [](int l, int r){
return (l&1) > (r&1);
});
return array;
}
};
上述解法,时间复杂度为 O ( n lg n ) O(n\lg n) O(nlgn),空间复杂度为 O ( 1 ) O(1) O(1)。接下来,再给出一种时间/空间复杂度为 O ( n ) O(n) O(n) 的解法。该解法拢共分三步:
- 先定义化一个长度为 n n n 的数组 a n w anw anw。
- 从前向后遍历 a r r arr arr,将奇数依次从前向后放入 a n w anw anw 中。
- 从后向前遍历 a r r arr arr,将偶数依次从后向前放入 a n w anw anw 中。
class Solution {
public:
vector<int> reOrderArray(vector<int>& array) {
vector<int> anw(array.size());
for (int i = 0, j = 0; i < array.size(); i++) {
if (array[i]&1) {
anw[j++] = array[i];
}
}
for (int i = array.size()-1, j = i; i >= 0; i--) {
if ((array[i]&1) == 0) {
anw[j--] = array[i];
}
}
return anw;
}
};