題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
思路一:借用vector輔助空間,時間複雜度爲O(n),空間複雜度爲O(n)。
class Solution{
public:
void reOrderArray(vector<int> &array){
int odd_count = 0;
for (int i = 0; i < array.size(); ++i){
if (array[i] % 2){
++odd_count;
}
}
int odd_idx = 0;
int eve_idx = odd_count;
vector<int> arr_temp(array.size());
for (int i = 0; i < array.size(); ++i){
if (array[i] % 2){
arr_temp[odd_idx++] = array[i];
}
else{
arr_temp[eve_idx++] = array[i];
}
}
array = arr_temp;
}
};
思路二:尾插,刪除之後,其實vector內部的代碼實現是把後面的所有數據都往前移動,時間複雜度爲O(n^2),空間複雜度爲O(1)。
class Solution{
public:
void reOrderArray(vector<int> &array){
int temp;
int size = array.size();
vector<int>::iterator arr_beg = array.begin();
while (size){
if (*arr_beg % 2 == 0){
temp = *arr_beg;
arr_beg = array.erase(arr_beg);
array.push_back(temp);
}
else{
++arr_beg;
}
--size;
}
}
};
或者:
class Solution {
public:
void reOrderArray(vector<int> &array) {
int s = array.size();
for (int i = 0; i < s; ++i){
if (array[i] % 2 == 0){
array.push_back(array[i]);
array.erase(array.begin() + i);
i--;
s--;
}
}
}
};