LeetCode.905-按奇偶排序數組(Sort Array By Parity)

這是悅樂書的第347次更新,第371篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第212題(順位題號是905)。給定一個非負整數數組A,返回一個由A的全部偶數元素組成的數組,後跟A的全部奇數元素。
你能夠返回知足此條件的任何答案數組。例如:算法

輸入:[3,1,2,4]
輸出:[2,4,3,1]
說明:[4,2,3,1],[2,4,1,3]和[4,2,1,3]也是正確答案。數組

注意數據結構

  • 1 <= A.length <= 5000指針

  • 0 <= A[i] <= 5000

    code

02 第一種解法

將數組A中的偶數元素存到List中,奇數元素存到List2中,建立一個新的數組result,長度和A相等,先遍歷List,將偶數元素存入result的前面,再遍歷List2,將奇數元素跟在偶數元素後面。get

此解法的時間複雜度是O(N),空間複雜度是O(N)it

public int[] sortArrayByParity(int[] A) {
    List<Integer> list = new ArrayList<Integer>();
    List<Integer> list2 = new ArrayList<Integer>();
    int n = A.length;
    for (int i=0; i<n; i++) {
        if (A[i]%2 == 0 ) {
            list.add(A[i]);
        } else {
            list2.add(A[i]);
        }
    }
    int[] result = new int[n];
    int index = 0;
    for (int j=0; j<list.size(); j++) {
        result[index++] = list.get(j);
    }
    for (int j=0; j<list2.size(); j++) {
        result[index++] = list2.get(j);
    }
    return result;
}


03 第二種解法

針對第一種解法,咱們再簡化下,不使用List存數據,咱們分兩次遍歷處理A中的元素,第一次只要偶數元素,存入新數組result中,第二次只要奇數元素,存入新數組result中。class

此解法的時間複雜度是O(N),空間複雜度是O(N)數據結構與算法

public int[] sortArrayByParity2(int[] A) {
    int n = A.length, index = 0;
    int[] result = new int[n];
    for (int i=0; i<n; i++) {
        if (A[i]%2 == 0 ) {
            result[index++] = A[i];
        }
    }
    for (int j=0; j<n; j++) {
        if (A[j]%2 != 0 ) {
            result[index++] = A[j];
        }
    }
    return result;
}


04 第三種解法

咱們也能夠只使用一個循環,不使用額外的數組,藉助雙指針來解題。

建立兩個指針,一個從A的第一位開始,記爲i,另一個從A的最後一位開始,記爲j。若是i對應的元素爲奇數,且j對應的元素是偶數,那麼就須要將兩個元素互換,互換後,偶數排在了前面,奇數換到了後面。另外咱們還須要讓兩個指針移動,以便遍歷完全部元素,若是i對應的元素爲偶數,就跳到下一個元素,同理,若是j對應的元素爲奇數,就跳到前一個元素,直到i不小於j。

此解法的時間複雜度是O(N),空間複雜度是O(1)

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


05 小結

算法專題目前已連續日更超過六個月,算法題文章215+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索