题意:
输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,
使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,
对奇数和奇数,偶数和偶数之间的相对位置不做要求。
方法一:
双指针
思路:利用双指针,左指针找偶数,右指针找奇数。
最后交换左右指针的数。
一直循环,直到左右指针相遇。
class Solution {
public:
vector<int> reOrderArrayTwo(vector<int>& array) {
int n=array.size();
int i=0,j=n-1;
while(i<j){//循环
while(i<j&&array[i]%2==1){//找偶数
i++;
}
while(i<j&&array[j]%2==0){//找奇数
j--;
}
swap(array[i],array[j]);//交换
}
return array;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
计数+双指针
思路:
遍历一遍数组,对奇数个数计数。
初始化左边奇数区间的范围,右边偶数区间的范围。
再利用双指针实现。
class Solution {
public:
vector<int> reOrderArrayTwo(vector<int>& array) {
int n=array.size();
int cnt=0;//奇数个数
for(int i=0;i<n;i++){
if(array[i]%2)
cnt++;
}
int x=0,y=cnt;
while(x<cnt&&y<n){//循环
while(x<cnt&&(array[x]%2))//寻找偶数
x++;
while(y<n&&(array[y]%2==0))//寻找奇数
y++;
if(x<cnt&&y<n)
swap(array[x],array[y]);//交换
}
return array;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号