1. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题:使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分 保证奇奇、偶偶之间的相对位置不变。
#创建两个新数组
#奇数单独依次存放 偶数单独依次存放
class Solution:
def reOrderArray(self , array: List[int]) -> List[int]:
ou,ji=[],[]
for i in array:
if i%2==0:
ou.append(i)
else:
ji.append(i)
return ji+ou
进阶:时间复杂度 O(n^2),空间复杂度 O(1)
一个指针p, 指向0,1,2,3用于放置奇数,一个指针q用于遍历数组
若指针q指向偶数继续遍历
若指针q指向奇数 将[p,q]间的偶数向后移动,将此奇数赋到左边的p指针位置
#双指针法
class Solution:
def reOrderArray(self , array: List[int]) -> List[int]:
p,q,n=0,0,len(array)
for q in range(n):
if array[q]%2==0:#若为偶数
q+=1
else:#若为奇数
tmp=array[q]
for i in range(q-1,p-1,-1):#把它前面的偶数往后移动
array[i+1]=array[i]
array[p],p=tmp,p+1#把奇数array[q]按顺序0,1,2,3...放置
q+=1
return array
2.JZ81 调整数组顺序使奇数位于偶数前面(二)
题:使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分 相对位置不做要求
- #双端队列:奇数插左边 偶数插右边
import collections
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
res=collections.deque()
for i in nums:
if i%2==0:
res.append(i)
else:
res.appendleft(i)
return list(res)
进阶:时间复杂度 O(n),空间复杂度 O(1)O(1)
#两端 双指针 空间复杂度更低 在数组内直接交换
#在原数组上改变 找到左边的偶数与右边的奇数交换
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
i,j=0,len(nums)-1
while i<j:
while nums[i]%2!=0 and i<j:#遍历目的:找到为偶数的nums[i]
i+=1
while nums[j]%2==0 and i<j:#目的:找到为奇数的nums[j]
j-=1
nums[i],nums[j]=nums[j],nums[i]
return nums