一起學(xué)算法-905.按奇偶排序數(shù)組

一、題目

LeetCode-905. 按奇偶排序數(shù)組
鏈接:https://leetcode-cn.com/problems/sort-array-by-parity/

難度:簡單
給定一個(gè)非負(fù)整數(shù)數(shù)組A返回一個(gè)數(shù)組,在該數(shù)組中, A的所有偶數(shù)元素之后跟著所有奇數(shù)元素。

你可以返回滿足此條件的任何數(shù)組作為答案。

示例:
輸入:[3,1,2,4]
輸出:[2,4,3,1]
輸出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也會(huì)被接受。

提示:

  • 1 <= A.length <= 5000
  • 0 <= A[i] <= 5000

二、解題思路

從題意中我們可知,只要把偶數(shù)移動(dòng)到數(shù)組左邊,而奇數(shù)在右邊即可,并不考慮數(shù)的大小順序。
本題雖然說是排序,但是根據(jù)其特點(diǎn)可以用雙指針來求解。
創(chuàng)建兩個(gè)指針leftright分別指向數(shù)組的頭和尾,根據(jù)leftright指針指向的奇偶性來做出操作,具體有四種情況;

  1. (1,0),交換兩個(gè)數(shù),并且left++,right--;
  2. (0,1),左右兩邊的數(shù)都不用動(dòng),left++,right--;
  3. (0,0),說明left的位置是正確的,只能left++;
  4. (1,1),說明right的位置是正確的,只能right--;

按照思路我們優(yōu)先判斷left位置的奇偶性,順著思路寫出以下代碼。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int left = 0,right = nums.size() - 1;
        while(left < right){
            if(nums[left]%2 == 1){
                if(nums[right]%2 == 0){
                    swap(nums[left],nums[right]);
                    left++;
                    right--;
                }else{
                    right--;
                }
            }else{
                left++;
            }
        }
        return nums;
    }
};

嵌套if不太好看,根據(jù)四種情況優(yōu)化一下代碼。

三、實(shí)現(xiàn)過程

c++

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int left = 0,right = nums.size() - 1;
        while(left < right){
            if (nums[left] % 2 > nums[right] % 2) swap(nums[left],nums[right]);
            if (nums[left] % 2 == 0) left++;
            if (nums[right] % 2 == 1) right--;
        }
        return nums;
    }
};

PHP

class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer[]
     */
    function sortArrayByParity($nums) {
        $left = 0;
        $right = count($nums) - 1;
        while($left < $right){
            if ($nums[$left] % 2 > $nums[$right] % 2) {
                $tmp = $nums[$left];
                $nums[$left] = $nums[$right];
                $nums[$right] = $tmp;
            }
            if ($nums[$left] % 2 == 0) $left++;
            if ($nums[$right] % 2 == 1) $right--;
        }
        return $nums;
    }
}

JavaScript

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortArrayByParity = function(nums) {
        let left = 0,right = nums.length - 1;
        while(left < right){
            if (nums[left] % 2 > nums[right] % 2) {
                let tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
            }
            if (nums[left] % 2 == 0) left++;
            if (nums[right] % 2 == 1) right--;
        }
        return nums;
};

四、小結(jié)

  1. 時(shí)間復(fù)雜度:O(N),N是數(shù)組的長度。
  2. 空間復(fù)雜度:O(1)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容