[LeetCode] 922. Sort Array By Parity II
Description
Given an array A
of non-negative integers, half of the integers in A are odd, and half of the integers are even.
Sort the array so that whenever A[i]
is odd, i is odd; and whenever A[i]
is even, i
is even.
You may return any answer array that satisfies this condition.
Example 1:
Input: [4,2,5,7] Output: [4,5,2,7] Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.
Note:
- 2 <= A.length <= 20000
- A.length % 2 == 0
- 0 <= A[i] <= 1000
Analyse
A
是一個非負整數數組,一半奇數一半偶數
對A
進行排序,使A
的奇數位置為奇數,偶數位置為偶數
使用兩個int變量存儲奇數和偶數的位置
even
(偶) 存儲第一個存了奇數的偶數位置
odd
(奇) 存儲第一個存了偶數的奇數位置
每一趟循環都找一遍odd
和even
,然後交換這兩個位置的值,進入下一次循環
下面是第一個版本的代碼,寫完後AC,甚至能faster than 100.00%
vector<int> sortArrayByParityII(vector<int>& A) { int even = 0; // first even position with a odd int odd = 1; // first odd position with a even for(int i = 0; i < A.size(); i++) { while ((A[even] % 2 == 0) && (even < A.size() - 1)) { even += 2; } while ((A[odd] % 2 != 0) && (odd < A.size())) { odd += 2; } if ((i % 2) != (A[i] % 2)) { int tmp = A[even]; A[even] = A[odd]; A[odd] = tmp; } } return A; }
但是這個版本代碼的循環退出條件有點怪,比如這些地方,for循環出現就很詭異,這個if判斷後交換兩元素的值也是,算出even
和odd
後並不一定會立即交換,而是會等到遍歷到奇數位不為奇數或偶數位不為偶數時才交換,最後雖然能交換成功,但總歸是不太好的解法
我也不知道這個版本我怎麽寫出來的,似乎是在for循環輸出vector的代碼基礎上改的
for(int i = 0; i < A.size(); i++) if ((i % 2) != (A[i] % 2)) { int tmp = A[even]; A[even] = A[odd]; A[odd] = tmp; }
繼續寫第二個版本,思考循環終止條件,循環終止的時候每個奇數位都是奇數,偶數位都是偶數了
再計算even
或odd
的時候就會大於A.size()
,使用這個當作循環結束的條件(copy了LeetCode上的代碼)
vector<int> sortArrayByParityII(vector<int>& A) {
int even = 0; // first even position with a odd
int odd = 1; // first odd position with a even
while ((even < A.size() - 1) && odd < A.size())
{
while ((A[even] % 2 == 0) && (even < A.size() - 1))
{
even += 2;
}
if (even >= A.size() - 1)
{
break;
}
while ((A[odd] % 2 != 0) && (odd < A.size()))
{
odd += 2;
}
if (odd >= A.size())
{
break;
}
int tmp = A[even];
A[even] = A[odd];
A[odd] = tmp;
}
return A;
}
[LeetCode] 922. Sort Array By Parity II