当前位置: 首页 > article >正文

算法随笔_26: 按奇偶排序数组

上一篇:算法随笔_25:长按键入-CSDN博客

=====

题目描述如下:

给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。

返回满足此条件的任一数组作为答案。

示例 1:

输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。

=====

算法思路:

题目要求将 nums 中的的所有偶数元素移动到数组的前面,奇数元素放到后面。简单的想法就是我们可以开辟一个同样大小空间的数组,先把所有的偶数依次放入新数组,然后把剩下的奇数依次放入新数组的后半部分。

但这里我们使用了一个更高效的算法,无需开辟新的数组空间,仅仅使用了一个常数空间。一些其他的算法题当中,题目常常要求使用常数空间,即,O(1) 的空间复杂度。

我们这样来考虑,我们需要把后面的偶数放到前面来,那前面需要有一个空格子可以容纳后面的这个偶数。那必然需要先从前面移走一个元素。移走哪个元素呢?如果前面是个偶数,它本来就符合条件,我们无需移动它。因此,我们需要把一个奇数移动到后面去。后面的偶数移动到前面,前面的奇数移动到后边,我们把两个步骤合二为一,那就是把他们两个元素交换一下即可。具体的算法如下:

1. 我们设两个指针p1和p2,p1=0,p2=1。

2. 我们使用这两个指针枚举数组中的每一个元素。会有如下的情形:

   a. 如果当前p1指向的元素是偶数,无需移动,所以我们把p1指针向右移动一格。

   b.  如果当前p1指向的元素是奇数,由于我们需要在后面找一个偶数与它交换,所以我们判断当前p2所指的元素是否是偶数。如果是偶数,我们交换p1和p2所指的元素。然后我们把p1指针向右移动一格。

把p2指针向右移动一格,然后重复步骤2。

当p2到达数组末尾的时候,退出循环,算法结束。此时所有的偶数都排到了前面,后面紧跟奇数。

此算法的时间复杂度是O(n) 。空间复杂度是O(1)。

下面是代码实现:

class Solution(object):
    def sortArrayByParity(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        p1=0
        p2=1
        nums_len=len(nums)
        tmp=0
        while p2 < nums_len:
            if nums[p1]%2==0:
                p1+=1
            elif nums[p2]%2==0:
                tmp=nums[p1]
                nums[p1]=nums[p2]
                nums[p2]=tmp
                p1+=1
                
            p2+=1
        return nums
            
                   


http://www.kler.cn/a/520378.html

相关文章:

  • OpenCV 版本不兼容导致的问题
  • .NET Core跨域
  • 用深度学习优化供应链管理:让算法成为商业决策的引擎
  • MyBatis框架基础学习及入门案例(2)
  • 华为OD机试E卷 --选修课--24年OD统一考试(Java JS Python C C++)
  • deepseek v1手机端部署
  • 蓝桥杯算法笔记|前缀和3382、3419
  • ubuntu设置系统自动更新
  • 计算机视觉:解锁智能世界的钥匙
  • Go的Slice底层数据结构和特性
  • NFTs 是网络艺术,而非数字艺术
  • 喜报丨迪捷软件入选2025年浙江省“重点省专”
  • 安装Ubuntu22.04
  • 自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • chrome源码剖析—UI架构消息机制
  • 嵌入式实时操作系统
  • css设置盒子动画,CSS3 transition动画 animation动画
  • 关于MySQL InnoDB存储引擎的一些认识
  • AI智能日志分析系统
  • DiffuEraser: 一种基于扩散模型的视频修复技术