這是悅樂書的第347次更新,第371篇原創
java
今天介紹的是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
將數組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; }
針對第一種解法,咱們再簡化下,不使用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; }
咱們也能夠只使用一個循環,不使用額外的數組,藉助雙指針來解題。
建立兩個指針,一個從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; }
算法專題目前已連續日更超過六個月,算法題文章215+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!