LeetCode-905. 按奇偶排序陣列
阿新 • • 發佈:2018-12-16
題目
給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。
你可以返回滿足此條件的任何陣列作為答案。
示例:
輸入:[3,1,2,4] 輸出:[2,4,3,1] 輸出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也會被接受。
解答
- 最簡單的方式就是對陣列進行一次"排序", 這個排序自定義大小規則, 我們設定所有偶數都小於奇數,偶數等於偶數, 奇數等於奇數, 按照這個規則, 對陣列進行排序, 排序完成之後就能夠得到題目想要的解答
- 更好的方式是使用快速排序, 這種相當於將陣列分割成兩部分, 很符合快速排序的partition操作, 所以只需要對陣列進行一次partition操作, 就可以將陣列按照奇偶進行排序了, 快速排序相關參考 :
下面使用程式碼展示用快速排序的方式解答這個問題 :
package num901_1000;
/**
* 給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。
* 你可以返回滿足此條件的任何陣列作為答案。
* @author xuxiumeng
*
*/
class Solution {
/**
* 交換兩個元素位置, 輔助程式碼
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 返回一個數組是否是偶數, 輔助函式
* @return
*/
private static boolean isEven(int num){
return num % 2 == 0;
}
/****************解題思路*********************/
/*
* 由於是將陣列分廠奇數和偶數的兩部分, 這樣就可以參考使用對陣列使用快速排序的思想
* 對整個陣列進行一次partition操作, 得到的就是目標陣列
*/
public int[] sortArrayByParity(int[] A) {
int l = 0; // 設定A[0~l-1]左閉右閉區間都是偶數
int i = 0; // 設定A[l~i)左閉右開區間都是奇數
for (i = 0; i < A.length; i++) {
if (isEven(A[i])) {
swap(A, i, l);
l++;
}
}
return A;
}
}