时间复杂度:O(n) 空间复杂度:O(n) */ classSolution { public: voidreOrderArray(vector<int>& array){ int n = array.size(); vector<int> temp(n, 0); int index = 0; for (int i = 0; i < n; i ++) { if ((array[i] & 1) == 1) { temp[index ++] = array[i]; } } for (int i = 0; i < n; i ++) { if ((array[i] & 1) == 0) { temp[index ++] = array[i]; } }
array.assign(temp.begin(), temp.end()); } };
/* 原地解法: 类似于冒泡排序。 前偶后奇就进行交换,这样一次可以将第一个奇数放在首位,同时最后一个偶数放在末尾。 时间复杂度:O(n^2) 空间复杂度:O(1) */ classSolution { public: voidreOrderArray(vector<int> &array){ int n = array.size(); for (int i = 0; i < n; i ++) { for (int j = n - 1; j > i; j --) { if (array[j] % 2 == 1 && array[j - 1] % 2 == 0) { swap(array[j], array[j - 1]); } } } } };
int left = 0, right = nums.size() - 1; while (left < right) { while (left < right && !isEven(nums[left])) left ++; while (left < right && isEven(nums[right])) right --; if (left < right) swap(nums[left ++], nums[right --]); } return nums; }
boolisEven(int n){ return (n & 1) == 0; } };
/* 思路同上 */ classSolution { public: vector<int> trainingPlan(vector<int>& nums){ // 维护 nums[0, slow) 都是奇数 int fast = 0, slow = 0; while (fast < nums.size()) { // fast 遇到奇数,交换 nums[fast] 与 nums[slow] if (nums[fast] % 2 == 1) { int temp = nums[slow]; nums[slow] = nums[fast]; nums[fast] = temp; slow ++; } fast ++; } return nums; } };