- 博客(299)
- 资源 (6)
- 收藏
- 关注
原创 【动态规划:简单多状态dp问题】按摩师
摘要: 本文介绍了动态规划解决按摩师预约问题的思路。题目要求从预约序列中选择不相邻的预约,使总时间最长。解法使用两个状态数组select和uncheck,分别表示选择或不选择当前预约时的最大时间。状态转移方程为: select[i] = uncheck[i-1] + nums[i] uncheck[i] = max(select[i-1], uncheck[i-1]) 初始化后从左往右填表,最终结果为两个数组末元素的最大值。代码实现简洁,时间复杂度O(n),空间复杂度O(n)。示例验证了算法的正确性。
2025-08-24 16:35:50
462
原创 【高并发内存池】二、整体框架设计
摘要: 本文介绍了一种高并发内存池的设计框架,针对多线程环境下的内存分配问题,通过三级缓存结构(thread cache、central cache、page cache)优化性能、减少锁竞争并缓解内存碎片。thread cache为线程独享,实现无锁分配;central cache作为共享资源,采用桶锁降低竞争;page cache负责大块内存管理及碎片合并。该设计参考tcmalloc,显著提升多线程场景下的内存分配效率。 (字数:150)
2025-08-24 16:33:18
888
原创 【动态规划:路径问题】最小路径和 && 地下城游戏
本文介绍了两个动态规划问题:最小路径和与地下城游戏。 最小路径和:给定 m x n 网格,从左上角到右下角找一条路径,使数字总和最小。使用动态规划,状态转移方程为 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j],初始化虚拟行列,填表顺序为从上到下、从左到右,时间复杂度 O(mn)。 地下城游戏:骑士从左上角出发,每次向右或向下移动,求确保能到达右下角的最低初始健康点数。与前题不同,需从后往前推导,状态转移方程为 dp[i][j] = min(dp[i+
2025-08-19 20:44:16
857
原创 【高并发内存池】一、简介 && 定长内存池实现
本文介绍了一个高并发内存池项目,其原型是Google的开源项目tcmalloc(Thread-Caching Malloc)。该项目旨在实现高效的多线程内存管理,替代系统内存分配函数(如malloc和free)。文章首先解释了内存池的概念及其优势,包括提高内存分配效率、减少内存碎片等。接着详细介绍了定长内存池的设计与实现,包括如何绕过malloc直接向堆申请空间,以及如何通过二级指针管理内存块。该项目综合运用了C/C++、数据结构、操作系统内存管理等知识,适合深入学习高性能内存管理技术。
2025-08-19 20:40:51
683
原创 【动态规划:路径问题】礼物的最大价值 && 下降路径最小和
本文介绍了两个动态规划问题:礼物的最大价值和下降路径最小和。 礼物的最大价值:在m×n棋盘上从左上角到右下角获取礼物的最大价值。使用动态规划,状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1],通过虚拟行列初始化避免边界问题,时间复杂度O(mn)。 下降路径最小和:在n×n矩阵中找从顶部到底部的最小和路径,允许向下、左下或右下移动。状态转移方程为dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i
2025-08-11 12:09:57
848
原创 【在线五子棋对战】十三、websocket长连接请求处理
本文介绍了WebSocket长连接请求处理的整体框架设计,主要分为建立连接和断开连接两大类型,并根据游戏大厅和游戏房间场景进行区分。文章重点阐述了三个核心回调函数: open_callback():处理WebSocket连接建立后的初始化工作,通过URI区分游戏大厅(/hall)和游戏房间(/room)连接 close_callback():处理连接断开前的清理工作 message_callback():处理连接中的消息通信 文中还提供了三个关键工具函数: websocket_response():统一的W
2025-08-11 12:03:24
577
原创 【动态规划:路径问题】不同路径Ⅱ
本文介绍了力扣63题"不同路径II"的解题思路。该题在经典动态规划的"不同路径"问题基础上增加了网格中的障碍物限制。文章指出,当遇到障碍物时路径数应为0,否则状态转移方程保持不变。关键点在于处理下标映射问题,因为动态规划表需要额外行列,访问原障碍物数组时需将下标减1。通过初始化dp[0][1]=1并遍历网格,遇到非障碍物时更新状态表,最终返回右下角的值。示例代码展示了具体实现,时间复杂度为O(mn)。
2025-08-10 19:53:06
329
原创 【在线五子棋对战】十二、http请求处理
本文介绍了HTTP请求处理的四类主要请求:页面请求(静态资源)、注册请求、登录请求和用户信息获取请求(动态功能)。重点展示了静态资源请求处理函数和注册请求处理函数的实现逻辑。静态资源处理函数通过URI路径组合文件路径,读取文件内容并返回响应;注册处理函数则通过反序列化请求正文,验证用户名密码完整性,并操作数据库完成用户注册。文中提供了详细的代码实现,包括错误处理、JSON序列化/反序列化等关键步骤。
2025-08-10 19:40:37
889
原创 【动态规划:路径问题】不同路径
摘要:本文介绍了LeetCode 62题"不同路径"的动态规划解法。题目要求计算机器人从m×n网格左上角移动到右下角的所有可能路径数(每次只能向右或向下移动)。通过创建二维DP数组,初始化虚拟边界,并应用状态转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1],最终在O(mn)时间/空间复杂度内求得结果。代码实现使用vector容器,通过双重循环填表,最后返回右下角的值作为答案。
2025-07-31 15:13:34
269
原创 【在线五子棋对战】十一、整合封装服务器模块实现
本文介绍了五子棋对战服务器的设计与实现,采用RESTful风格接口设计,主要分为网络通信接口设计和服务器搭建两部分。服务器整合了注册、登录、对战匹配等模块,通过实例化gobang_server类提供简便的服务器搭建接口。重点阐述了10种请求的数据格式规范,包括静态资源请求(如注册/登录页面)、用户管理(注册/登录)、信息获取、WebSocket协议切换(大厅/房间)、对战操作(匹配/取消/下棋)和聊天功能,每种请求都定义了详细的请求和响应格式,成功和失败的响应示例。服务器通过不同业务逻辑处理各类请求,实现完
2025-07-31 15:11:16
819
原创 【动态规划:斐波那契数列模型】解码方法
摘要: 题目要求将数字字符串解码为字母组合(A-Z对应1-26),计算可能的解码方法总数。关键点在于处理前导零和有效数字组合(10-26)。使用动态规划,dp[i]表示前i个字符的解码总数,分两种情况:单独解码(s[i]≠0)或与前一位组合解码(10≤组合数≤26)。初始化时需处理边界条件,优化方法通过增加虚拟头节点简化代码。时间复杂度O(n),空间复杂度O(n)。示例:"12"解码为"AB"或"L",输出2。
2025-07-25 21:07:04
707
原创 【在线五子棋对战】十、对战玩家匹配管理模块
五子棋对战匹配系统设计与实现 摘要:本文介绍了五子棋游戏对战匹配系统的设计与实现。系统根据玩家天梯分数划分为青铜(<2000)、白银(2000~3000)和黄金(>3000)三个档次,每个档次维护独立的匹配队列。采用双向链表实现线程安全的匹配队列,支持入队、出队和取消匹配操作。管理类维护三个匹配队列及对应线程,当队列人数≥2时自动匹配成功并创建游戏房间。系统包含匹配开始/停止、匹配成功响应等接口,通过条件变量实现线程阻塞机制,确保匹配过程的线程安全。该设计有效解决了玩家分级匹配和取消匹配的需求,
2025-07-25 21:00:59
982
原创 【问题记录】Vue3 浏览器插件不起作用的问题
Vue3浏览器插件无法检测问题的解决方案:当Vue开发者工具插件已安装但不起作用时,检查发现需在插件详情页开启"允许访问文件网址"权限。本文通过图文详细展示了问题现象(开发者工具无Vue选项)、排查过程(确认插件已启用)和解决方法(修改插件权限设置并重启浏览器),最终使Vue插件成功识别Vue应用。该问题常见于本地开发环境,是Vue3初学者容易遇到的典型配置问题。
2025-07-21 10:46:28
166
原创 【动态规划:斐波那契数列模型】使用最小花费爬楼梯(easy)
摘要: 题目要求计算爬楼梯的最小花费,每次可跨1或2步,初始可从第0或1层开始。两种动态规划解法: 正向解法:dp[i]表示到达第i层的最小花费,状态转移为dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]),初始化dp[0]=dp[1]=0,最终返回dp[n]。 逆向解法:dp[i]表示从第i层到楼顶的最小花费,状态转移为dp[i] = min(dp[i+1], dp[i+2]) + cost[i],初始化末尾两层为对应成本,最终返回min(dp[0], dp
2025-07-11 10:49:48
678
原创 【在线五子棋对战】九、session管理模块
摘要 本文介绍了Web开发中session的概念及其实现设计。session用于解决HTTP协议无状态问题,通过为每个客户端创建专属会话对象来维护用户状态。文章阐述了session的工作原理,并基于websocketpp提供的定时器机制实现会话过期管理。在具体实现层面,设计了session类(包含会话ID、用户ID、状态和定时器等成员)和session_manager类(负责会话创建、销毁、获取及过期设置)。session_manager通过哈希表管理会话信息,并使用互斥锁确保线程安全,其中关键功能包括分配
2025-07-11 10:46:55
1000
原创 【动态规划:斐波那契数列模型】三步问题(easy)
摘要: 三步问题要求计算小孩上n阶楼梯的方式,每次可走1、2或3阶。使用动态规划,定义dp[i]为到达第i阶的方法数,状态转移方程为dp[i] = dp[i-1] + dp[i-2] + dp[i-3]。需初始化前3项(dp[1]=1, dp[2]=2, dp[3]=4)并处理越界情况。结果需模1000000007防止溢出。时间复杂度O(n),空间复杂度O(n)。例如,n=3时有4种走法,n=5时有13种。
2025-07-08 11:59:30
451
原创 【在线五子棋对战】八、在线用户管理模块 && 房间管理模块
本文摘要: 在线用户管理模块通过哈希表建立用户ID与WebSocket连接的映射关系,实现对游戏大厅和游戏房间用户的在线状态管理,提供用户连接获取、状态判断等功能,所有操作均需加锁保证线程安全。 房间系统分为房间类和房间管理类: 房间类管理单个房间内的游戏状态(棋盘、玩家信息等)和处理游戏动作(下棋、聊天),需实现动作广播功能。 房间管理类负责多个房间的创建销毁等全局管理。 设计了15×15棋盘及相关枚举类型,房间类包含房间ID、状态、玩家信息等核心成员变量。
2025-07-08 11:55:49
755
原创 【在线五子棋对战】七、数据管理模块实现
摘要: 本文设计了一个五子棋游戏的数据管理模块,包含数据库表设计和数据管理类实现。数据库表user存储用户信息(ID、用户名、密码)和积分数据(分数、总场次、胜场)。通过user_table类封装数据库操作,提供注册、登录、用户信息查询及胜负处理等功能,使用互斥锁保证线程安全。MySQL操作句柄在构造时初始化,析构时释放。注册功能验证用户名密码后执行SQL插入,确保数据一致性。
2025-06-17 21:35:09
733
原创 【在线五子棋对战】六、项目结构设计 && 工具模块实现
摘要 该项目实现了一个基于WebSocket的五子棋对战平台,主要分为三大模块: 数据管理模块:使用MySQL进行用户数据存储和管理 前端界面模块:实现注册、登录、游戏大厅和房间等页面交互 业务处理模块:搭建WebSocket服务器处理客户端请求 业务处理模块细分为五个子模块: 网络通信(websocketpp库实现) 会话管理(cookie/session机制) 在线用户管理 房间管理(对战和聊天功能) 用户匹配系统(按天梯分数匹配) 项目开发前期准备了五个实用工具类: 日志宏:实现格式化日志输出,包含时
2025-06-14 09:42:16
1076
原创 【在线五子棋对战】五、前端扫盲:html && css && javascript && ajax && jquery && websocket
HTML基础知识点摘要 HTML是网页开发的基础语言,由标签构成。常见标签包括: 基础结构标签:html、head、body、title 文本标签:h1-h6标题、p段落、br换行、b/i/u/s格式化文本 媒体标签:img图片(src必填)、a超链接(href必填) 布局标签:table表格、ul/ol列表 表单标签:form表单域、input输入控件(文本框、密码框、单选框、复选框等) 标签间存在父子或兄弟关系,形成DOM树结构。表单是用户输入的主要途径,包含表单域和控件。HTML标签可通过属性设置样式
2025-06-12 12:03:13
1115
原创 【在线五子棋对战】四、MySQL API 使用
MySQL C API使用指南摘要 MySQL数据库采用C/S架构,客户端通过C语言API连接服务器。操作步骤包括: 初始化连接:使用mysql_init()创建句柄,通过mysql_real_connect()连接服务器,需提供IP、端口、用户名、密码和数据库名。 字符集设置:调用mysql_set_character_set()设置为utf8以支持中文。 数据库操作: 执行SQL:mysql_query()用于增删改查 查询结果处理:mysql_store_result()获取结果集,mysql_num
2025-06-10 13:27:42
743
原创 【在线五子棋对战】三、Json && JsonCpp的使用
JSON是一种轻量级的数据交换格式,采用独立于编程语言的文本格式存储数据,易于读写和解析。JSON主要有两种数据结构:数组([]表示)和对象({}表示),两者可以交叉嵌套使用。数组元素类型灵活,对象由键值对组成,其中键必须是字符串。使用JSON时需注意文件只能有一个根节点(对象或数组)。JsonCpp库提供了JSON序列化和反序列化功能,通过Json::Value类存储数据,并提供了丰富的操作接口。序列化步骤包括构建Json::Value对象、创建StreamWriter实例并输出JSON字符串。
2025-06-09 08:36:56
781
原创 【在线五子棋对战】二、websocket && 服务器搭建
WebSocket是一种基于TCP的双向通信协议,支持服务器主动推送消息,适用于即时通讯等场景。它与HTTP兼容,通过升级协议实现连接,具有轻量、高效、跨域等优势。WebSocket的握手过程通过HTTP请求头完成,报文格式包含FIN、Opcode、Mask等关键字段。 WebSocketpp是一个C++库,实现了WebSocket协议,支持客户端和服务器开发。它依赖Asio网络库,提供事件驱动接口,支持多种协议和线程安全。常用接口包括设置事件回调函数(如set_open_handler),server类继
2025-06-07 10:15:22
1322
原创 【动态规划:斐波那契数列模型】第 N 个泰波那契数
这篇文章介绍了如何计算第N个泰波那契数。泰波那契数列定义为T0=0,T1=1,T2=1,之后每个数是前三个数之和。文章使用动态规划方法解题,创建了dp数组存储中间结果,通过状态转移方程dp[i]=dp[i-1]+dp[i-2]+dp[i-3]逐步计算。同时给出了空间优化版本,仅使用四个变量替代数组,降低了空间复杂度。两种解法的时间复杂度均为O(n),空间优化版本将空间复杂度从O(n)降为O(1)。最后给出了示例代码实现这两种解法。
2025-05-29 21:27:06
437
原创 【在线五子棋对战】一、项目简介 && 环境搭建
本项目实现了一个基于网页的五子棋对战平台,主要功能包括: 用户管理模块:支持注册、登录、个人信息查看及天梯分数记录 游戏对战系统:基于玩家分数匹配对手,实现在线五子棋对战 实时聊天功能:支持对局中玩家交流 技术栈: 后端:C++11、Websocket++、JsonCpp、MySQL 前端:HTML/CSS/JavaScript/AJAX 开发环境:Linux(CentOS/Ubuntu)、GCC/GDB、Makefile 环境搭建: 基础工具:安装wget、lrzsz、Git、CM
2025-05-29 21:24:03
1081
原创 【分治】翻转对
本文介绍了使用归并排序和双指针方法解决LeetCode 493题「翻转对」问题。题目要求在数组中找到满足i < j且nums[i] > 2*nums[j]的重要翻转对数量。通过归并排序将数组分成子序列并递归处理,合并前利用双指针按降序计算翻转对数量,确保指针不回退以提高效率。关键步骤包括分治、双指针统计翻转对、合并有序数组。该方法时间复杂度为O(n log n),适用于大规模数据。
2025-05-28 16:34:34
520
原创 【网络编程】十八、Reactor模式
C/S 模型:服务端压力大P2P 模型:网络负载高 (可以看成 C/S 模型的扩展)2、服务器编程框架IO 处理单元:服务器管理客户端连接的框架,通常等待并接受新的客户端连接,接受客户端数据,将服务器响应返回给客户端. 但是数据收发不一定在IO 处理单元,也可能在逻辑单元中执行,取决于事件处理模式。逻辑单元:通常是一个线程或者进程,分析并处理客户端数据,然后把结果传递给 IO 处理单元或者直接发送客户端网络存储单元:数据库、缓存、文件等,非必须的请求队列:各单元之间的通信方式的抽象,通常被实现为
2025-05-28 16:33:04
1009
原创 【分治】计算右侧小于当前元素的个数
本题要求计算数组中每个元素右侧小于它的元素个数,可通过归并排序的分治思想高效解决。由于归并排序会改变原数组元素顺序,需引入辅助数组 index 记录原始下标,确保排序过程中能正确累加结果到对应位置。 关键步骤: 创建辅助数组 index 存储元素原始下标。 归并排序采用降序处理,当左区间元素大于右区间时,计算右侧较小元素数量。 使用 tmp1 和 tmp2 分别处理原数组和 index 数组的归并过程。 通过 index 数组将结果累加到正确位置,保持时间复杂度为 O(n log n)。 该
2025-05-27 21:49:00
1080
原创 【网络编程】十七、多路转接之 epoll
epoll机制详解 epoll是Linux特有的高效多路复用IO机制,专为处理大规模并发连接设计。相比select/poll,epoll具有以下优势:1)支持大规模并发连接;2)采用高效的事件通知机制,避免无效遍历;3)内核管理事件表减少内存拷贝;4)支持边缘触发(ET)模式提升效率。 epoll系统调用包含三个核心函数: epoll_create() - 创建epoll实例,返回事件表文件描述符 epoll_ctl() - 管理事件表,支持添加/修改/删除监听事件 epoll_wait() - 等待
2025-05-27 21:46:14
1049
原创 【分治】数组中的逆序对
本文介绍了两种基于归并排序的解法来计算数组中的逆序对数量。第一种思路利用升序排序,在合并过程中统计左区间大于右区间的元素个数;第二种思路通过降序排序,统计右区间小于左区间的元素个数。两种方法均通过分治策略将时间复杂度优化至O(nlogn),避免了暴力解法的O(n²)复杂度。代码实现中展示了升序合并时的关键判断逻辑,通过临时数组辅助完成排序与统计。该问题展示了归并排序在统计特定顺序对时的巧妙应用。
2025-05-26 13:16:32
1164
原创 【网络编程】十六、多路转接之 poll
select和poll都是POSIX标准的多路复用IO接口,核心区别在于: API设计不同:select使用fd_set集合,poll使用pollfd结构体数组 扩展性差异:select受FD_SETSIZE限制,poll无此限制 效率对比:poll通过链表管理描述符,效率略高 poll函数原型为int poll(struct pollfd *fds, nfds_t nfds, int timeout),其优势在于输入输出事件分离(events/revents)和突破描述符数量限制,但仍需
2025-05-26 13:12:32
711
原创 【分治】归并排序:递归版 && 非递归版
本文介绍了归并排序的递归和非递归实现方法,用于解决LeetCode上的“排序数组”问题。归并排序基于分治思想,递归版通过二分法将数组分为左右两部分,分别排序后再合并;非递归版则通过控制归并区间的大小,逐步将数组排序。两种方法都使用了辅助数组来存储中间结果,最终将排序后的数组返回。归并排序的时间复杂度为O(n log n),适用于大规模数据的排序。
2025-05-22 12:56:54
609
原创 【网络编程】十五、多路转接之 select
select 函数是一种用于多路复用输入/输出的系统调用,允许程序监视多个文件描述符的状态变化。它通过等待文件描述符的可读、可写或异常事件来实现,但本身不负责数据拷贝,拷贝工作由 read 或 write 等系统调用完成。select 函数的原型包括参数 nfds(监听的文件描述符总数)、timeout(超时时间)以及 readfds、writefds、exceptfds(分别表示可读、可写、异常事件的文件描述符集合)。这些集合通过位图表示,系统提供 FD_SET、FD_CLR 等宏操作位图。select
2025-05-22 12:54:59
1108
原创 【分治】最小的k个数
本文介绍了如何通过快速选择算法在整数数组中找到最小的k个数。与传统的排序或堆方法相比,快速选择算法的时间复杂度接近O(n),效率更高。算法的核心思想是随机选取基准值,并将数组分为三个区间:小于基准值、等于基准值和大于基准值。根据k与各区间的元素个数的关系,递归地在相应区间中寻找最小的k个数。最终,算法将前k个最小的数放在数组的最左边并返回。这种方法不仅高效,而且不需要返回有序数组,适用于大规模数据处理。
2025-05-21 10:16:40
919
原创 【网络编程】十四、五种常见IO模型详解
文章主要介绍了五种常见的IO模型,并通过钓鱼的例子形象地解释了这些模型的工作原理。五种IO模型分别是:阻塞式IO、非阻塞式IO、信号驱动式IO、多路转接式IO和异步IO。其中,前四种属于同步IO,进程或线程亲自参与IO处理;而异步IO则由操作系统处理完成后通知应用程序。文章还强调了IO的本质是“等待+数据拷贝”,提高IO效率的关键在于减少等待时间。此外,文章还介绍了高级IO中的重要概念,如同步与异步、阻塞与非阻塞的区别,并提到了一些高级IO技术,如非阻塞IO、多路转接等。最后,文章介绍了fcntl函数,用于
2025-05-21 10:14:11
1078
原创 【分治】数组中的第K个最大元素(快速选择算法)
本文介绍了如何在数组中找到第K个最大元素的两种方法。第一种方法是使用堆排序,通过维护一个大小为K的小根堆,遍历数组后将堆顶元素作为结果,时间复杂度为O(n log k)。第二种方法是快速选择算法,基于快速排序的分治思想,通过递归选择区间来找到第K个最大元素,时间复杂度为O(n)。文章详细解释了两种方法的实现思路,并提供了相应的代码示例。快速选择算法在时间复杂度上更优,适合处理大规模数据。
2025-05-20 09:24:10
983
原创 【网络编程】十三、DNS && ICMP && NAT/NAPT && 代理服务器
域名系统(DNS)是将域名转换为IP地址的应用层协议,基于UDP协议。最初通过hosts文件管理域名与IP的映射,但随着网络扩展,DNS系统应运而生,由组织管理机构维护数据库,自动查询域名对应的IP。域名解析过程包括查询浏览器缓存、操作系统缓存、本地hosts文件、本地DNS服务器,直至根DNS服务器和顶级DNS服务器。使用dig工具可以分析DNS解析过程。当在浏览器输入包含域名的URL时,会触发DNS查询,随后通过TCP/IP协议与服务器通信,获取并显示网页内容,包括静态资源和通过AJAX进行的异步请求。
2025-05-20 09:22:10
976
原创 【分治】快速排序
本文介绍了如何通过分治思想实现快速排序算法,以解决LeetCode上的“排序数组”问题。传统的快速排序在处理大量重复元素时效率较低,时间复杂度可能达到O(n^2)。为此,文章提出了一种改进方法,即将数组划分为左、中、右三部分,分别包含小于、等于和大于基准值的元素。这种方法在处理重复元素时效率更高。文章详细描述了如何随机选择基准值,并通过递归对左右两部分进行排序,直到区间缩小到无法再分。最终,通过这种改进的快速排序算法,能够高效地对数组进行升序排列。
2025-05-19 11:24:44
1018
原创 【网络编程】十二、两万字详解 IP协议
网络层负责将数据从一台主机传输到另一台主机,主要解决数据路由问题。数据在传输过程中需要经过封装、路由和解包的过程,类似于从一栋楼到另一栋楼的路径选择。网络层通过路由器进行路径选择,路由器通过路由表找到最短路径。IP协议是网络层的核心协议,其报头包含版本号、首部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、首部检验和、源IP地址、目的IP地址等字段。IP协议通过定长报头和自描述字段的方式分离报头和有效载荷,并根据协议字段决定将有效载荷交付给上层的哪个协议。
2025-05-19 11:22:43
1225
原创 【分治】颜色分类
文章介绍了如何通过分治思想解决LeetCode上的“颜色分类”问题。该问题要求将包含0、1、2的数组原地排序,使得相同颜色的元素相邻,并按0、1、2的顺序排列。文章详细解释了使用三个指针(left、right、i)来维护数组的三个部分(0、1、2)的边界,并通过遍历数组将元素分类到相应的区间。具体操作包括交换元素和移动指针,最终实现数组的排序。文章还提供了C++代码示例,并强调了遍历时只需到right指针即可,避免重复交换。通过这种方法,可以在常数空间内完成一趟扫描的排序。
2025-05-17 16:01:16
649
c/c++实现高并发内存池
2025-01-25
嵌入式软件服务器开发的毕业实习总结:温湿度监测系统的设计与实现
2025-01-25
(校内课程设计)c/c++实现停车场管理系统
2025-01-25
c++实现在线版五子棋(包含Websocket++、JsonCpp、Mysql、c++11、BlockQueue阻塞队列、HTML / CSS / JS / AJAX等技术栈的使用)
2025-01-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人