LeetCode 922 按奇偶排序数组2

LeetCode 922 按奇偶排序数组2

https://leetcode-cn.com/problems/sort-array-by-parity-ii/

既然题目要求说数组A的元素个数是偶数个并且其中一半是奇数一半是偶数,那么该数组一定可以排序成当A[i]为奇数时,i也是奇数;当A[i]为偶数时,i也是偶数的形式。

我们稍微分析一下可以发现不满足上述要求的情况有两种:
(1)i是奇数,但A[i]是偶数
(2)i是偶数,但A[i]是奇数

而且我们只要把上述两种情况下的元素调换即可满足题目要求。由于前面分析过,题目一定是可解的,所以可以推断上述情况(1)和(2)在数组A中出现的个数一定是相同的。我们可以对数组A扫描一遍,然后把情况(1)和(2)所对应的下标存入两个集合(S_1)(S_2)当中,这两个集合的个数应该是相等的。然后依次从这两个集合当中取出两个下标值,交换它们对应的元素即可。

代码如下:

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& A) {
        vector<int> s1, s2;
        int sz = A.size();
        for (int i = 0; i < sz; ++i) {
            if (i % 2 == 1 && A[i] % 2 == 0) s1.push_back(i);
            if (i % 2 == 0 && A[i] % 2 == 1) s2.push_back(i);
        }
        assert(s1.size() == s2.size());
        for (int i = 0; i < s1.size(); ++i) {
            swap(A[s1[i]], A[s2[i]]);
        }

        return A;
    }
};

当然本题的力扣题解里有其他的解法,但题比较简单,这里就不写其他解法了。

原文地址:https://www.cnblogs.com/wallace-lai/p/13961909.html