记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
1、问题描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
2、数据结构:
数组
3、题解:
方法一:
#-*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
ret = []
for i in array:
if i % 2 == 1:
ret.append(i)
for i in array :
if i % 2 == 0:
ret.append(i)
return ret
方法二:双指针法
#-*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
i, j = 0, len(array) - 1
while i < j:
while i < j and array[i] & 1 == 1: i += 1 #从前往后找,遇奇数,i就加1;直到找到偶数
while i < j and array[j] & 1 == 0: j -= 1 #从前往后找,遇偶数,j减1;直到找到奇数
array[i], array[j] = array[j], array[i] #交换
return array
方法三:快慢指针法
#-*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
low, fast = 0, 0
while (fast < len(array)):
if array[fast] & 1:
array[low], array[fast] = array[fast], array[low]
low += 1
fast += 1
return array
注意:方法2和方法3不能保证奇数和奇数,偶数和偶数的相对位置严格一致。
4、复杂度分析:
方法一:
时间复杂度:O(N)
空间复杂度:O(N)
方法二:
时间复杂度:O(N^2)
空间复杂度:O(1)
方法三:
时间复杂度:O(N)
空间复杂度:O(1)