LeetCode 按奇偶排序数组II(双指针)

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

示例:

输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

提示:

2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000

思 路 分 析 : \color{blue}思路分析: 这道题我们只要使用两个指针evenPtr、oddPtr,oddPtr扫描奇数下标、evenPtr扫描偶数下标。左移evenPtr,直到A[evenPtr]和evenPtr奇偶性不相同,左移oddPtr,直到A[oddPtr]和oddPtr奇偶性不相同,这时交换A[evenPtr]和A[oddPtr]即可。重复此步骤,直到到达左端。

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& A) {
        //分别指向偶数下标,奇数下标最后一个元素
        int evenPtr = A.size() - 2, oddPtr = A.size() - 1;
        while (evenPtr >= 0 && oddPtr > 0){
            //跳过偶数下标中A[i]是偶数的位置
            while (evenPtr >= 0 && A[evenPtr] % 2 == 0){
                evenPtr -= 2;
            }
            //跳过奇数下标中A[i]是奇数的位置
            while (oddPtr > 0 && A[oddPtr] % 2 == 1){
                oddPtr -= 2;
            }
            //奇数、偶数指针指向的元素都相对于自身的下标奇偶性不相同,则交换
            if (evenPtr >= 0 && oddPtr > 0){
                swap(A[evenPtr], A[oddPtr]);
                evenPtr -= 2;
                oddPtr -= 2;
            }
        }
        return A;
    }
};

LeetCode 按奇偶排序数组II(双指针)_第1张图片

你可能感兴趣的:(LeetCode,数组,双指针)