题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。提示:
0 <= nums.length <= 50000
1 <= nums[i] <= 10000
解题思路1: 头尾双指针法
- 借用 快速排序 的思想, 定义2个指针, 分别在头尾.
- 头指针往后遍历, 找到偶数位置停下(类似快排找到比tag大的值)
- 尾指针往前遍历, 找到奇数位置停下(类似快排找到比tag小的值)
- 头尾指针交换, 然后继续遍历, 直到指针相撞 时间复杂度: 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: 快慢双指针法
- 定义快慢指针, 初始位置都为0.
- 快指针逐步遍历到最后
- 如果快指针的位置是奇数, 则与慢指针数据交换, 快慢指针+1
- 如果快指针的位置是偶数, 跳过继续遍历 时间复杂度: 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