這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!