zoukankan      html  css  js  c++  java
  • 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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    NetCore使用Log4Net记录日志
    WCF数据协议中XmlArrayItem标签不起作用的问题
    WTM Blazor,Blazor开发利器
    WTM5.0发布,全面支持.net5
    log4netdemo
    mes 入库单号 锁表方案
    线程基础篇-线程同步
    线程基础篇-线程和进程
    EF基础篇-Code First
    EF基础篇-DB First
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11027360.html
Copyright © 2011-2022 走看看