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

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

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

02 第一種解法

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

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

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中。

此解法的時間複雜度是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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章