PROBLEM

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

难度 简单

MY ANSWER

顺序遍历,偶数存入偶数数组,奇数存入奇数数组,返回组合后的数组。时间复杂度O(n),空间复杂度O(n)。

class Solution {
public:
vector<int> exchange(vector<int>& nums) {
vector<int> even;
vector<int> odd;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] & 1) {
odd.push_back(nums[i]);
}
else {
even.push_back(nums[i]);
}
}
for(int i = 0; i < even.size(); i++) {
odd.push_back(even[i]);
}
return odd;
}
};

BETTER SOLUTION

类似快排的双指针法,进行交换。第一种是一头一尾,第二种是两个都从头开始。时间复杂度O(n),空间复杂度O(1)。

class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
if ((nums[left] & 1) != 0) {
left ++;
continue;
}
if ((nums[right] & 1) != 1) {
right --;
continue;
}
swap(nums[left++], nums[right--]);
}
return nums;
}
};
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int low = 0, fast = 0;
while (fast < nums.size()) {
if (nums[fast] & 1) {
swap(nums[low], nums[fast]);
low ++;
}
fast ++;
}
return nums;
}
};

SUMMARY

复习一下快排思想。