LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)

这是悦乐书的第354次更新,第379篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第216题(顺位题号是922)。给定非负整数的数组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

02 第一种解法

使用两个List将奇数、偶数分别存起来,创建一个新的数组result,如果索引为奇数,就从存奇数的List中取值作为新数组的元素,反之就从存偶数的List中取值作为新数组的元素。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII(int[] A) {
    List<Integer> odd = new ArrayList<Integer>();
    List<Integer> even = new ArrayList<Integer>();
    for (int num : A) {
        if (num%2 == 0) {
            even.add(num);
        } else {
            odd.add(num);
        }
    }
    int j = 0, k = 0;
    int[] result = new int[A.length];
    for (int i=0; i<result.length; i++) {
        if (i%2 == 0) {
            result[i] = even.get(j++);
        } else {
            result[i] = odd.get(k++);
        }
    }
    return result;
}

03 第二种解法

我们也可以直接从A中取值,同样是新建一个result数组,对result数组新建两个索引,一个从0开始,只做偶数索引,另一个从1开始,只做奇数索引,分两次遍历A数组,将对应的元素和索引值存入result中。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII2(int[] A) {
    int[] result = new int[A.length];
    int j = 0;
    for (int i=0; i<A.length; i++) {
        if (A[i]%2 == 0) {
            result[j] = A[i];
            j += 2;
        }
    }
    int k = 1;
    for (int i=0; i<A.length; i++) {
        if (A[i]%2 != 0) {
            result[k] = A[i];
            k += 2;
        }
    }
    return result;
}

04 第三种解法

针对上面的第二种解法,我们也可以只使用一次循环。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII3(int[] A) {
    int[] result = new int[A.length];
    int j = 0, k = 1;
    for (int i=0; i<A.length; i++) {
        if (A[i]%2 == 0) {
            result[j] = A[i];
            j += 2;
        } else {
            result[k] = A[i];
            k += 2;
        }
    }
    return result;
}

05 第四种解法

双指针。

定义两个指针i和j,i代表偶数索引,从0开始;j代表奇数索引,从n-1开始(n为数组A的length),如果偶数索引位置对应的元素为奇数,且奇数索引位置对应的元素为偶数,就进行元素交换。如果偶数索引位置对应的元素为偶数,偶数索引i就加2,同理,奇数索引位置对应的元素为奇数,奇数索引j就减2,循环结束条件为i不小于n或者j小于1。

此解法的时间复杂度是O(N),空间复杂度是O(1)

public int[] sortArrayByParityII4(int[] A) {
    int i = 0, j = A.length-1, n = A.length;
    while (i < n && j >= 1) {
        if (A[i]%2 == 1 && A[j]%2 == 0) {
            int tem = A[j];
            A[j] = A[i];
            A[i] = tem;
        }
        if (A[i]%2 == 0) {
            i += 2;
        }
        if (A[j]%2 == 1) {
            j -= 2;
        }
    }
    return A;
}

06 小结

算法专题目前已连续日更超过六个月,算法题文章222+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

posted @ 2019-06-15 13:42  程序员小川  阅读(364)  评论(0编辑  收藏  举报