【剑指offer】21、调整数组顺序使奇数在偶数前面

题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。

思路一

从前往后扫描数组,遇到一个偶数就把它放到数组末尾,并且把之后的数字往前挪,这也会改变奇数与偶数的相对位置

时间复杂度O(n2)

1 2 3 4 5 6 7

1 3 4 5 6 7 2

1 3 5 6 7 2 4

1 3 5 7 2 4 6

1 3 5 7 4 6 2

1 3 5 7 4 2 6

问题就是出在,当满足奇数在偶数前面之后,还对偶数部分进行了操作

解决方案:先统计出偶数个数n,然后进行后插n次停止即可。

扫描二维码关注公众号,回复: 2266210 查看本文章
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.size() == 0) 
            return;
        int length = array.size(), count = 0;
        for (int i = 0; i < length; i++)
            if (array[i] % 2 == 0) count++;
       
         int i = 0;
        while (i < length && count){
            if (array[i] % 2 == 1)
                i++;
            else if (array[i] % 2 == 0)
            {
                int temp = array[i];
                for (int j = i; j < length - 1; j++)
                    array[j] = array[j+1];

                array[length-1] = temp;
                count--;
            }
        }
    }
};

思路二

在数组头和数组尾设置两个指针,当第一个指针指向偶数,第二个指针指向奇数,则交换他们的位置,时间复杂度O(n)

但是这会改变奇数与偶数的相对位置

1 2 3 4 5 ->  1 5 3 4 2

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.size() == 0 ) return;
        int p1 = 0, p2 = array.size() - 1;
        while (p1 <= p2)
        {
            while (p1 <= p2 && (array[p1] % 2 == 1))
                p1++;
            while (p1 <= p2 && (array[p2] % 2 == 0))
                p2--;
            if (p1 <= p2){
                int temp = array[p2];
                array[p2] = array[p1];
                array[p1] = temp;
            }
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/shiganquan/p/9340920.html