原文链接:https://leetcode-cn.com/problems/sort-array-by-parity/
给定一个非负整数数组 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
解题思路:
想法:
如果希望原地排序,可以使用快排,一个经典的算法。
算法:
维护两个指针 i 和 j,循环保证每刻小于 i 的变量都是偶数(也就是 A[k] % 2 == 0 当 k < i),所有大于 j 的都是奇数。
所以, 4 种情况针对 (A[i] % 2, A[j] % 2):
如果是 (0, 1),那么万事大吉 i++ 并且 j--。
如果是 (1, 0),那么交换两个元素,然后继续。
如果是 (0, 0),那么说明 i 位置是正确的,只能 i++。
如果是 (1, 1),那么说明 j 位置是正确的,只能 j--。
通过这 4 种情况,循环不变量得以维护,并且 j-i 不断变小。最终就可以得到奇偶有序的数组。
class Solution {
public int[] sortArrayByParity(int[] A) {
int i = 0, j = A.length - 1;
while (i < j) {
if (A[i] % 2 > A[j] % 2) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
if (A[i] % 2 == 0) i++;
if (A[j] % 2 == 1) j--;
}
return A;
}
}
or:
class Solution905 {
public int[] sortArrayByParity(int[] A) {
int left=0;
int right=A.length-1;
while(left<right){
if(A[left]%2==1&&A[right]%2==0){
int temp=A[left];
A[left]=A[right];
A[right]=temp;
}else if(A[left]%2==0&&A[right]%2==1){
left++;
right--;
}else if(A[left]%2==0&&A[right]%2==0){
left++;
}else{
right--;
}
}
return A;
}
}