zoukankan      html  css  js  c++  java
  • 按奇偶排序数组 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]<<" ";
        }
        
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13455984.html

  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13455984.html
Copyright © 2011-2022 走看看