按奇偶排序数组 II
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
你可以返回任何满足上述条件的数组作为答案。
示例:
输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
代码:
#include<iostream>
#include<bits/stdc++.h>
#include<vector>
#include<iterator>
using namespace std;
vector<int> vec1,vec2,vec3;
int main(){
int n,num;
cin>>n;
for (size_t i = 0; i < n; i++)
{
cin>>num;
vec1.push_back(num);
}
for (vector<int>::iterator it = vec1.begin(); it != vec1.end(); it++)
{
if (*it&1)
{
vec2.push_back(*it);
}else{
vec3.push_back(*it);
}
}
for (vector<int>::iterator it = vec2.begin(); it < vec2.end(); it++)
{
cout<<*it<<" ";
}
cout<<endl;
for (vector<int>::iterator it = vec3.begin(); it <vec3.end(); it++)
{
cout<<*it<<" ";
}
vector<int>::iterator it2=vec2.begin();
vector<int>::iterator it3=vec3.begin();
vec1.erase(vec1.begin(),vec1.end());
int len=vec2.size()+vec3.size();
for (int i = 0; i < len; i++)
{
if(i&1){
vec1.push_back(*it2);
it2++;
continue;
}
vec1.push_back(*it3);
it3++;
}
cout<<endl;
for (vector<int>::iterator it = vec1.begin(); it < vec1.end(); it++)
{
cout<<*it<<" ";
}
}
方法一: 两次遍历
思路和算法
遍历一遍数组把所有的偶数放进 ans[0],ans[2],ans[4],依次类推。
再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],依次类推。
官方代码:
void sortArrayByParityII(vector<int> vec){
int len = vec.size();
int *arr = new int[len+1];
int t=0;
for (vector<int>::iterator it = vec.begin(); it!=vec.end(); it++)
{
if(*it%2==0){
arr[t]=*it;
t+=2;
}
}
t=1;
for (vector<int>::iterator it = vec.begin(); it!=vec.end(); it++)
{
if(*it%2==1){
arr[t]=*it;
t+=2;
}
}
for (int i = 0; i < len; i++)
{
cout<<arr[i]<<" ";
}
}
复杂度分析
-
时间复杂度: O(N),其中 NN 是
A
的长度。 -
空间复杂度: O(N)。
方法二: 双指针
思路
我们可能会被面试官要求写出一种不需要开辟额外空间的解法。
在这个问题里面,一旦所有偶数都放在了正确的位置上,那么所有奇数也一定都在正确的位子上。所以只需要关注 A[0], A[2], A[4], ... 都正确就可以了。
将数组分成两个部分,分别是偶数部分 even = A[0], A[2], A[4], ... 和奇数部分 odd = A[1], A[3], A[5], ...。定义两个指针 i 和 j, 每次循环都需要保证偶数部分中下标 i 之前的位置全是偶数,奇数部分中下标 j 之前的位置全是奇数。
算法
让偶数部分下标 i 之前的所有数都是偶数。为了实现这个目标,把奇数部分作为暂存区,不断增加指向奇数部分的指针,直到找到一个偶数,然后交换指针 i,j 所指的数。
官方代码:
int main(){
int n ;
cout<<"enter the count of the array"<<endl;
cin>>n;
int *arr = new int[n+1];
for (int i = 0; i < n; i++)
{
cin>>arr[i];
}
int j =1;
for (int i = 0; i < n; i=i+2)
{
if (arr[i]&1)
{
while (arr[j]&1)
j+=2;
}
swap(arr[i],arr[j]);
}
for (int i = 0; i < n; i++)
{
cout<<arr[i]<<" ";
}
}
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13455984.html