剑指 Offer 21. 调整数组顺序使奇数位于偶数前面、JZ81 调整数组顺序使奇数位于偶数前面(二)

 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值