java 双指针思路超简单一看就懂
双指针
i i i找第一个不满足偶数位置上放偶数的, j j j找第一个不满足奇数位置上放奇数的,两者换一下,如此重复到末尾即可。因为各占一半,因此当任意一个指针超出范围时,一定就满足了题意。
class Solution {
public int[] sortArrayByParityII(int[] A) {
int i = -2, j = -1, n = A.length;
while(i < n && j < n){
do i += 2; while(i < n && (A[i] & 1) == 0);
do j += 2; while(j < n && (A[j] & 1) == 1);
if(i < n && j < n){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
return A;
}
}
时间复杂度
虽然时两重循环,但 i , j i,j i,j两个指针均只走了 n / 2 n / 2 n/2步,所以时间复杂度为 O ( n ) O(n) O(n)。
空间复杂度
直接在原数组修改,使用常量级额外空间 O ( 1 ) O(1) O(1)。