问题描述:
提示:这里描述项目中遇到的问题:
解题分析:
方法一:利用2个辅助vector,先遍历一遍nums,偶数的放一个 vector,奇数的放一个vector,然后再拼接
话不多说,拿到题目,第一个想到的方法,不要太简单
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
if(nums.size()<=1)
{
return nums;
}
vector<int>A,B;
//A为偶数 B为奇书
for(auto i=nums.begin();i!=nums.end();i++)
{
if(*i %2==0)
{
A.push_back(*i);
}
else
{
B.push_back(*i);
}
}
while(!A.empty())
{
int a=A.back();
B.push_back(a);
A.pop_back();
}
return B;
}
};
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
方法二:首尾指针
用
i
和
j
i和j
i和j来表示2个指针,分别代表nums[i] 和nums[j]
i指向数组首部,j指向数组尾部,i永远都在j的前面
那么就有4种情况
1.
n
u
m
s
[
i
]
nums[i]
nums[i]表示偶数,
n
u
m
s
[
j
]
nums[j]
nums[j]表示偶数。j往前移,j–
2.
n
u
m
s
[
i
]
nums[i]
nums[i]表示奇数,
n
u
m
s
[
j
]
nums[j]
nums[j]表示偶数。i往后走,i++
3.
n
u
m
s
[
i
]
nums[i]
nums[i]表示奇数,
n
u
m
s
[
j
]
nums[j]
nums[j]表示奇数。i往后走,i++
4.
n
u
m
s
[
i
]
nums[i]
nums[i]表示偶数,
n
u
m
s
[
j
]
nums[j]
nums[j]表示奇数。交换
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
if(nums.size()==0)//首尾指针
{
return nums;
}
int i=0;
int j=nums.size()-1;
int temp;
while(i<j)
{
if(nums[i]%2==0 && nums[j]%2==0)
{
j--;
}
else if(nums[i]%2!=0 && nums[j]%2==0)
{
i++;
}
else if(nums[i]%2!=0 && nums[j]%2!=0)
{
i++;
}
else
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
return nums;
}
};
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
方法三:快慢指针
- 分别定义快慢指针为fast ,slow.都指向数组首部
- fast 一步一步往后移,若遇到奇数就和slow交换,交换后slow++,表示左边加了个奇数
- fast若没有遇到奇数,就一直后移,直到到达数组尾部
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
if(nums.size()==0)//快慢指针
{
return nums;
}
int fast=0,slow=0;
while(fast<nums.size())
{
if(nums[fast]%2!=0)
{
int t=nums[fast];
nums[fast]=nums[slow];
nums[slow]=t;
slow++;
}
fast++;
}
return nums;
}
};
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)