按奇偶排序数组 II

922. 按奇偶排序数组 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]<<" ";
    }
    
}

 

posted @ 2020-08-07 23:53  多发Paper哈  阅读(96)  评论(0编辑  收藏  举报
Live2D