剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

90 阅读1分钟

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

提示:
0 <= nums.length <= 50000
1 <= nums[i] <= 10000

解题思路1: 头尾双指针法

  1. 借用 快速排序 的思想, 定义2个指针, 分别在头尾.
  2. 头指针往后遍历, 找到偶数位置停下(类似快排找到比tag大的值)
  3. 尾指针往前遍历, 找到奇数位置停下(类似快排找到比tag小的值)
  4. 头尾指针交换, 然后继续遍历, 直到指针相撞 时间复杂度: O(n)

示例代码1

def exchange(nums: [int]) -> [int]:
    l, r = 0, len(nums) - 1  # 步骤1
    while l < r:
        while l < r and nums[l] & 1 == 1:  # 步骤2
            l += 1
        while l < r and nums[r] & 1 == 0:  # 步骤3
            r -= 1 
        nums[l], nums[r] = nums[r], nums[l] # 步骤4
    return nums

解题思路2: 快慢双指针法

  1. 定义快慢指针, 初始位置都为0.
  2. 快指针逐步遍历到最后
  3. 如果快指针的位置是奇数, 则与慢指针数据交换, 快慢指针+1
  4. 如果快指针的位置是偶数, 跳过继续遍历 时间复杂度: O(n)

示例代码2

def exchange(nums: [int]) -> [int]:
    fast, low = 0, 0  # 步骤1

    while fast < len(nums):
        if nums[fast] & 1: # 步骤2,3
            nums[low], nums[fast] = nums[fast], nums[low]
            low += 1
        fast += 1 # 步骤4

    return nums