905. Sort Array By Parity。

版权声明:本文为博主原创文章,转载请标明出处:http://blog.csdn.net/leafage_m https://blog.csdn.net/Leafage_M/article/details/85412554

Given an array A of non-negative integers, return an array consisting of all the even elements of A, followed by all the odd elements of A.You may return any answer array that satisfies this condition.

>Input: [3,1,2,4]
Output: [2,4,3,1]
The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.

原文:https://leetcode.com/problems/sort-array-by-parity/


让把一个数组中的偶数放置在奇数前面,并且偶数和奇数的顺序并没有要求。


最简单的做法就是将原来数组中的奇数和偶数分开存放,然后再将它们组合再一起。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& A) {
        int i=0,j=0,num_len = A.size();
        vector<int> even_vector,odd_vector;
        while(i < num_len) {
            if(A[i]%2 == 0)//even
                even_vector.push_back(A[i]);
            else//odd
                odd_vector.push_back(A[i]);
            i++;
        }
        i=0,j=0;
        while(i < even_vector.size()) {
            A[i] = even_vector[j];
            i++;
            j++;
        }
        j=0;
        while(j < odd_vector.size()) {
            A[i] = odd_vector[j];
            i++;
            j++;
        }
        return A;
    }
};

但是这样无疑既浪费时间又浪费空间,但是可以在这上面再次优化一下,既然对奇数和偶数的顺序没有要求,只仅仅是所有的偶数在奇数前面即可。就可以创建一个空的数组,然后遍历原来的数组,一旦遇到偶数将放在新数组的前面,遇到奇数就放在新数组的后面。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& A) {
        vector<int> result(A.size(),0);// 定义一个与A一样大的容器
        int even_index=0;
        int odd_index = A.size() - 1;
        int i=0;
        while(even_index <= odd_index) {
            if(A[i]%2 == 0)// even
                result[even_index++] = A[i];
            else // odd
                result[odd_index--] = A[i];
            i++;
        }
        return result;
    }
};

上述的两种做法的空间复杂度都是O(n),那么就需要考虑如何在空间复杂度为O(1)的情况下完成交换。同样的按照偶数在前奇数在后的原则,使用两个索引来进行查找偶数和奇数,偶数索引从前往后,奇数索引从后往前。一旦偶数索引指向的为奇数,奇数索引指向的是偶数,则交换这两个数字。


class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& A) {
        int even_index = 0;// 偶数的索引,从前往后
        int odd_index = A.size()-1;// 奇数的索引,从后往前
        while(even_index < odd_index) {
            while(A[even_index]%2==0) even_index++;// 如果当前是偶数,则向后寻找
            while(A[odd_index]%2!=0) odd_index--;// 如果当前是奇数,则向前寻找

            if(even_index < odd_index)
                swap(A[even_index],A[odd_index]);
        }
        return A;
    }
};

猜你喜欢

转载自blog.csdn.net/Leafage_M/article/details/85412554