概述
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,
并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目分析:黑色这一部分是本题的重点,如果没有这个要求,如果这题没有加粗的这个条件,这是一个原版微软笔试题,我也来说下做法,设置两个指针head和tail,分别指向首尾,head向后移动,直到找到第一个偶数,tail向前移动,直到找到第一个奇数,交换这两个数,重复上述过程,直到head和tail相等为止;
时间复杂度:O(n);
空间复杂度:O(1)。
时间复杂度:O(n);
空间复杂度:O(1)。
class Solution {
public:
void reArray(vector<int> &array) {
int head = 0, tail = array.size() - 1;
while (head < tail) {
for (; head < tail && array[head] % 2; head++);
for (; head < tail && !(array[tail] % 2); tail--);
if (head < tail)
swap(array[head++], array[tail--]);
}
}
};
考虑加粗条件:现在我们再来考虑加粗的条件,首先肯定是最直白的算法,统计一下奇数的数量,然后开一个辅助数组,扫描原数组,发现奇数就往辅助数组的前面放,发现偶数就往辅助数组“后面”放,最后另原数组等于辅助数组就行了。
时间复杂度:O(n);
空间复杂度:O(n)
class Solution {
public:
void reOrderArray(vector<int> &array) {
int cnt = 0;
for (int i = 0; i < (int)array.size(); cnt += array[i++] % 2);
vector<int> arr(array);
for (int i = 0, j = cnt, id = 0; id < (int)array.size(); id++)
array[id] % 2 ? arr[i++] = array[id] : arr[j++] = array[id];
array.swap(arr);
}
};
然而,STL中内置了稳定排序算法stable_sort。O(n)=nlogn,空间为O(n)=2n
class Solution {
public:
void reOrderArray(vector<int> &array) {
stable_sort(array.begin(), array.end(), cmp);
}
static bool cmp(const int &A, const int &B)
{
return (A % 2 && !(B % 2));
}
};
还可以O(n)=n^2,O(n)=1
class Solution {
public:
void reOrderArray(vector<int> &array) {
for (int i = 0; i < (int)array.size(); i++)
for (int j = 0; j < (int)array.size() - i - 1; j++)
if (!(array[j] % 2) && array[j + 1] % 2)
swap(array[j], array[j + 1]);
}
};
最后
以上就是霸气柚子为你收集整理的剑指offer第十三题链表中奇偶位置交换的全部内容,希望文章能够帮你解决剑指offer第十三题链表中奇偶位置交换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复