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

news/2025/1/27 12:15:34/

上一篇:算法随笔_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=0p2=1nums_len=len(nums)tmp=0while p2 < nums_len:if nums[p1]%2==0:p1+=1elif nums[p2]%2==0:tmp=nums[p1]nums[p1]=nums[p2]nums[p2]=tmpp1+=1p2+=1return nums


http://www.ppmy.cn/news/1566479.html

相关文章

Redis缓存:春招面试的关键知识点

在上一篇文章中&#xff0c;我们深入探讨了MySQL数据库的核心知识&#xff0c;包括索引、事务和锁机制&#xff0c;这些对于保证数据的高效存储和一致性至关重要。而在当今的互联网应用中&#xff0c;为了提升系统性能和响应速度&#xff0c;缓存技术不可或缺。Redis作为一款高…

【集合】ArrayList扩容机制的源码剖析

ArrayList内部主要是维护一个Object[]的数组 初始化 ArrayList在初始化的时候主要是有两种初始化的方式&#xff1a; 无参的构造方法有参的构造方法 无参的构造方法&#xff1a;会在初始化的时候将elementData设置为{}&#xff0c;当添加第一个元素的时候&#xff0c;将容量…

React 前端开发解析:从核心概念到最佳实践

引言 React 作为当今最流行的前端框架之一&#xff0c;凭借其组件化、声明式编程和高效的虚拟 DOM 机制&#xff0c;彻底改变了现代 Web 开发的范式。无论是构建小型应用还是复杂的企业级系统&#xff0c;React 都展现出了强大的灵活性和可扩展性。本文将深入探讨 React 的核心…

MySQL命令及用法(精华版)

目录 DDL&#xff08;数据定义语言&#xff09; 数据库操作 表操作 DML&#xff08;数据操作语言&#xff09; DQL&#xff08;数据查询语言&#xff09; 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 DCL&#xff08;数据控制语言&#xff09; 用户…

python学opencv|读取图像(四十四)原理探究:bitwise_and()函数实现图像按位与运算

【1】引言 前序学习进程中&#xff0c;已经掌握了两张图片按位与操作的基本技巧&#xff1a; python学opencv|读取图像&#xff08;四十三&#xff09;使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客 【2】cv2.bitwise_and()函数实现图像按位与运算原理 【2.1】图像…

智能安全策略-DPL

一、华三防火墙-接口的概念。 1、接口。 1. 什么是接口&#xff1f; 接口就像是防火墙的“门”&#xff0c;用来连接不同的网络设备&#xff0c;比如电脑、路由器、服务器等。通过这些“门”&#xff0c;数据&#xff08;比如网页、视频、文件&#xff09;才能进出防火墙。 …

Skia使用Dawn后端在Windows窗口中绘图

首先创建一个Windows窗口&#xff0c;如下代码所示&#xff1a; void WindowMain::createWindow() {static bool isWcexReg false;static const TCHAR clsName[] L"SkiaApp";static WNDCLASSEX wcex;auto hinstance GetModuleHandle(NULL);if (!isWcexReg) {wcex…

PLC通信

PLC&#xff08;可编程逻辑控制器&#xff09;通信是指 PLC 与其他设备或系统之间进行数据传输和信息交换的过程 一、PLC通信方式 1 &#xff09;串行通信 数据按位顺序依次传输&#xff0c;只需要一对传输线&#xff0c;成本低&#xff0c;传输距离长&#xff0c;但速度相对…