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
复习一下快排思想。