1. 程式人生 > >[LeetCode] 922. Sort Array By Parity II

[LeetCode] 922. Sort Array By Parity II

copy 不知道 遍歷 leetcode 奇數 desc 不一定 交換 循環

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:

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

Analyse

A是一個非負整數數組,一半奇數一半偶數

A進行排序,使A的奇數位置為奇數,偶數位置為偶數

使用兩個int變量存儲奇數和偶數的位置

even(偶) 存儲第一個存了奇數的偶數位置

odd(奇) 存儲第一個存了偶數的奇數位置

每一趟循環都找一遍oddeven,然後交換這兩個位置的值,進入下一次循環

下面是第一個版本的代碼,寫完後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判斷後交換兩元素的值也是,算出evenodd後並不一定會立即交換,而是會等到遍歷到奇數位不為奇數或偶數位不為偶數時才交換,最後雖然能交換成功,但總歸是不太好的解法

我也不知道這個版本我怎麽寫出來的,似乎是在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;
}

繼續寫第二個版本,思考循環終止條件,循環終止的時候每個奇數位都是奇數,偶數位都是偶數了

再計算evenodd的時候就會大於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