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;
}
};
当然本题的力扣题解里有其他的解法,但题比较简单,这里就不写其他解法了。