思路:
法1:建立一个与原数组同大小的数组res,两次遍历A,偶数放入res的偶下标,奇数放入奇下标;
法2:双指针;
法3:双端队列,遍历A,计数插入前端,偶数插入尾端,然后双指针(1首1尾)对队列遍历,交换位置即可;
//两次遍历
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int n = A.size();
vector<int> ans(n);
int i = 0;
for (int x: A) {
if (x % 2 == 0) {
ans[i] = x;
i += 2;
}
}
i = 1;
for (int x: A) {
if (x % 2 == 1) {
ans[i] = x;
i += 2;
}
}
return ans;
}
};
//双指针
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int n = A.size();
int j = 1;
for (int i = 0; i < n; i += 2) {
if (A[i] % 2 == 1) {
while (A[j] % 2 == 1) {
j += 2;
}
swap(A[i], A[j]);
}
}
return A;
}
};
//双端队列
vector<int> sortArrayByParityII(vector<int> &A)
{
int len = A.size();
deque<int> q;
for (int i = 0; i < len; i++)
{
if ((i & 1) != (A[i] & 1))
{
//奇数插入到首段,偶数插入到尾端
if (i & 1)
{
q.push_front(i);
}
else
{
q.push_back(i);
}
}
}
int start = 0, end = q.size() - 1;
while (start < end)
{
int temp=A[q[start]];
A[q[start]]=A[q[end]];
A[q[end]]=temp;
start++;
end--;
}
return A;
}