在问 · 算法题解

905. 按奇偶排序数组

题目描述

输入整数数组 nums。

调整元素顺序,使所有偶数都排在所有奇数前面。

偶数内部、奇数内部的相对顺序不限,返回任意一个满足要求的数组即可。

示例 1
输入:nums = [3,1,2,4]
输出:[4,2,1,3]

解释:偶数 4、2 在前,奇数 1、3 在后;[2,4,3,1] 等也正确。

示例 2
输入:nums = [0]
输出:[0]

数据范围

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

解题思路

用左右两个指针从两端向中间收缩。i 左边保证都是偶数,j 右边保证都是奇数。每轮先看是否“左奇右偶”,是就交换,一次修正两个放错的数;然后如果 nums[i] 是偶数就把 i 右移,如果 nums[j] 是奇数就把 j 左移。i 与 j 相遇时,整个数组就分好了。

为什么正确

nums[0..i) 全是偶数,nums(j..n-1] 全是奇数;中间 [i, j] 是尚未确定的部分。

复杂度分析

时间 O(n),每轮 i 右移或 j 左移至少一个;额外空间 O(1),原地交换。

易错点

循环里三个 if 是并列的,交换后要用交换后的值判断是否移动指针;答案不唯一,只要偶数全在奇数前面就算对。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def sortArrayByParity(self, nums: List[int]) -> List[int]:
        i, j = 0, len(nums) - 1
        while i < j:
            if nums[i] % 2 == 1 and nums[j] % 2 == 0:
                nums[i], nums[j] = nums[j], nums[i]
            if nums[i] % 2 == 0:
                i += 1
            if nums[j] % 2 == 1:
                j -= 1
        return nums

载入编辑器,自己跑一遍 →

双指针 专题的其他题目

查看 双指针 全部题目 →