剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode) (leetcode-cn.com)
目录
方案1:快速排序的手段
代码
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int i = -1, j = -1, N = nums.size();
while (++j != N) if (nums[j] % 2) swap(nums[++i], nums[j]);
return nums;
}
};
复杂度
时间复杂度O(n),空间复杂度O(1).
运行结果
方案2 :开辟新数组
代码
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int N = nums.size();
vector<int> ans(N);
for(int i = 0, iter = 0, riter = N - 1; i != N; ++i){
nums[i] % 2 ? ans[iter++] = nums[i] : ans[riter--] = nums[i];
}
return ans;
}
};
复杂度
时间复杂度O(n),空间复杂度O(n).
运行结果
方案3:从两边,向中间
设置两个迭代器,一个正向,一个反向。当正向迭代器遇到偶数,反向迭代器遇到奇数,就交换它们位置的值。
代码
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int iter = 0, riter = nums.size() - 1;
while (iter < riter) {
if (nums[iter] % 2) ++iter;
else if (!(nums[riter] % 2)) --riter;
else swap(nums[iter++], nums[riter--]);
}
return nums;
}
};
复杂度
时间复杂度O(n),空间复杂度O(1).