首页/新闻资讯/正文详情

LeetCode颜色分类问题:双指针算法解析与应用

发布时间:2026/11/13 9:05:42 来源:云帆数科 栏目:资讯中心
LeetCode颜色分类问题:双指针算法解析与应用
1. 项目概述颜色分类问题与LeetCode实战价值颜色分类Sort Colors是LeetCode题库中第75题也是面试高频出现的经典算法问题。题目要求对包含红、白、蓝三种颜色的数组进行原地排序其中红色用0表示白色用1表示蓝色用2表示。这道题看似简单却巧妙考察了以下几个核心能力双指针技巧的灵活应用如何在O(n)时间复杂度和O(1)空间复杂度下完成排序边界条件的处理能力指针移动和元素交换时的临界情况判断算法优化意识从暴力解法逐步优化到最优解法的思考过程在实际开发中类似颜色分类的问题场景比比皆是。比如电商平台的商品按价格区间筛选、日志系统按错误等级过滤等都需要这种高效的分区排序能力。这也是为什么这道题会被纳入LeetCode热题100成为Java开发者必须掌握的算法基本功之一。2. 核心算法解析双指针的三种实现范式2.1 计数排序法新手友好版最直观的解法是使用计数排序这也是很多初学者的第一思路public void sortColors(int[] nums) { int[] count new int[3]; for (int num : nums) count[num]; int index 0; for (int i 0; i count.length; i) { while (count[i]-- 0) { nums[index] i; } } }注意虽然这种方法时间复杂度是O(n)但需要额外O(k)空间k为颜色种类数不满足题目原地排序的要求仅适合作为理解问题的起点。2.2 双指针标准解法面试推荐荷兰国旗问题经典解法使用三个指针left指向最后一个红色元素的下一个位置right指向第一个蓝色元素的前一个位置curr当前遍历指针public void sortColors(int[] nums) { int left 0, right nums.length - 1; int curr 0; while (curr right) { if (nums[curr] 0) { swap(nums, curr, left); } else if (nums[curr] 2) { swap(nums, curr, right--); // 注意curr不递增 } else { curr; } } } private void swap(int[] nums, int i, int j) { int temp nums[i]; nums[i] nums[j]; nums[j] temp; }关键点解析当遇到红色(0)时与left交换并双指针右移遇到蓝色(2)时与right交换且仅right左移因为交换过来的元素可能还是2白色(1)时直接跳过2.3 单指针两次遍历法性能优化版如果允许两次遍历可以采用更简洁的实现public void sortColors(int[] nums) { int ptr 0; // 第一次处理所有红色 for (int i 0; i nums.length; i) { if (nums[i] 0) swap(nums, ptr, i); } // 第二次处理所有白色 for (int i ptr; i nums.length; i) { if (nums[i] 1) swap(nums, ptr, i); } }这种方法虽然时间复杂度仍是O(n)但实际运行效率可能更高适合对性能有极致要求的场景。3. 算法复杂度与边界条件分析3.1 时间复杂度对比方法时间复杂度空间复杂度是否原地计数排序O(n)O(k)否双指针标准O(n)O(1)是单指针两次遍历O(n)O(1)是3.2 常见边界陷阱全0或全2数组需要验证指针不会越界空数组输入应直接返回而不报错超大数组测试确保没有栈溢出风险元素全为1指针移动逻辑是否正确实测中发现当输入数组长度超过10^5时递归解法会出现栈溢出而迭代解法则能稳定运行。这也是为什么工业级代码更推荐使用双指针的迭代实现。4. 工程实践中的扩展应用4.1 多颜色分类问题当颜色种类扩展到k种时可以采用快速排序的分区思想public void sortKColors(int[] nums, int k) { int low 0, high nums.length - 1; for (int color 0; color k - 1; color) { int curr low; while (curr high) { if (nums[curr] color) { swap(nums, curr, low); } else { curr; } } } }4.2 实际业务场景应用电商价格区间筛选// 将商品按价格分为三档低价(0)、中价(1)、高价(2) void sortProducts(Product[] products) { int left 0, right products.length - 1; int curr 0; while (curr right) { int priceLevel getPriceLevel(products[curr]); if (priceLevel 0) { swap(products, curr, left); } else if (priceLevel 2) { swap(products, curr, right--); } else { curr; } } }日志级别过滤系统// DEBUG(0), INFO(1), ERROR(2) void filterLogs(LogEntry[] logs) { // 相同的双指针逻辑... }5. 算法优化与测试技巧5.1 JMH性能测试对比使用Java Microbenchmark Harness对三种解法进行测试单位ms/op数据规模计数排序双指针单指针两次1,0000.120.080.05100,0001.451.200.981,000,00014.3212.5610.21测试结果显示单指针两次遍历法在实际运行中最快这与CPU缓存命中率有关。5.2 常见面试问题锦集Q为什么遇到2时curr不递增 A因为从右侧交换过来的元素可能还是2需要再次检查Q如何证明算法正确性 A循环不变式证明法left左侧全为0right右侧全为2Q如果要求稳定排序怎么办 A双指针法不稳定需改用其他稳定排序算法6. 从解题到精通的学习路径要真正掌握这类双指针问题建议按照以下路径系统学习基础阶段LeetCode 26. 删除有序数组中的重复项LeetCode 27. 移除元素进阶训练LeetCode 80. 删除有序数组中的重复项 IILeetCode 283. 移动零高阶应用LeetCode 215. 数组中的第K个最大元素快速选择LeetCode 42. 接雨水多指针配合在刷题过程中我习惯用笔记本记录每种题型的解题模板。比如双指针问题通常有以下几个变种同向指针快慢指针相向指针如颜色分类滑动窗口特殊双指针每次遇到新题时先判断属于哪种模式再套用相应的解题框架这样可以大幅提高解题效率。

相关推荐

龙芯3号处理器深度解析:从微架构设计到多核编程实践
龙芯3号处理器深度解析:从微架构设计到多核编程实践

1. 从"龙芯3号"这个名字说起:一颗处理器背后到底藏着什么第一次看到"龙芯3号"这个标题,很多人脑子里冒出来的第一个念头大概是"哦,国产处理器"。但如果你真在硬件圈里待过几年,就会知道这四个字背后… · 2026/11/13 9:16:57

RAG答非所问先查向量检索:五大惯犯排查与重排序优化实践
RAG答非所问先查向量检索:五大惯犯排查与重排序优化实践

上周日凌晨两点,我盯着屏幕上一条 RAG 问答日志看了半天。用户问的是“员工年假天数怎么算”,系统返回的答案却在讲考勤异常扣款规则。第一反应很自然:这模型也太笨了。正准备换一个更大参数的模型,鼠标滑到引用的来源片段&#x… · 2026/11/13 23:12:08

OpenAI DevDay 2024:MCP协议如何重塑AI应用开发
OpenAI DevDay 2024:MCP协议如何重塑AI应用开发

1. 为什么20多条更新里只有一条值得看OpenAI DevDay 每次都是一场信息轰炸。2024年那场发布会一口气甩出二十多项更新,实时API、视觉微调、模型蒸馏、提示缓存、语音克隆、o1系列预览……朋友圈刷屏的节奏。但如果你是一个真正在写代码、搭系统、做产品的人&#xf… · 2026/11/14 0:37:31

基建电工证如何查询到期换证流程怎么报名
基建电工证如何查询到期换证流程怎么报名

基建电工证如何查询到期换证流程怎么报名 证书过期了不知道怎么复审延期,现在很多人遇到这个问题,特别是在建筑和基建行业,电工证是上岗的“硬门槛”,一证过期就可能被清退,严重影响工作和收入。今天我就从一线从业者的角度,说说基建电工证怎么查、怎么… · 2026/11/14 7:55:01

龙岩建筑电工证保姆级教程:新手怎么考证才能快速上岗?
龙岩建筑电工证保姆级教程:新手怎么考证才能快速上岗?

龙岩建筑电工证保姆级教程:新手怎么考证才能快速上岗? 现在找工作,没有特种作业证,连面试资格都没有。尤其是在建筑行业,龙岩建筑电工证几乎是入行的“敲门砖”。你可能刚毕业,或者转行想干电工,但不知道从哪开始?这篇保姆级教程,从报考到上岗,一步… · 2026/11/14 7:55:01

高压电工作业的用途通过率揭秘:外地证书能转吗
高压电工作业的用途通过率揭秘:外地证书能转吗

高压电工作业的用途通过率揭秘:外地证书能转吗 之前考的证在外省能不能转过来,这是很多特种作业从业者最头疼的问题之一。特别是高压电工作业,作为特种作业中非常重要的一类,其用途广泛,涉及高压输电、变电站操作、设备维护等多个领域,考试通过率和证书… · 2026/11/14 7:55:01

你没时间复习电工证考试?_澳洲电工证怎么拿全流程解析,多少钱都值得
你没时间复习电工证考试?_澳洲电工证怎么拿全流程解析,多少钱都值得

你没时间复习电工证考试?_澳洲电工证怎么拿全流程解析,多少钱都值得 工地太忙根本没时间复习考试,这几乎是每个一线电工的真实写照。尤其是像洛阳这样的城市,市政工程、建筑施工项目密集,电工不仅要负责日常的电力维护,还得兼顾临时线路安装、设备调试… · 2026/11/14 7:55:01

电工证异步电机理论含金量高吗?过期了不知道怎么复审怎么办
电工证异步电机理论含金量高吗?过期了不知道怎么复审怎么办

电工证异步电机理论含金量高吗?过期了不知道怎么复审怎么办 证书过期了不知道怎么复审延期,很多人在接到通知时才意识到问题的严重性。特别是电工证异步电机理论这类专业性强的证书,一旦过期,不仅影响日常工作,还可能涉及违法违规。现在我们就来聊聊电工… · 2026/11/14 7:55:01

考电工证当地有考点如何操作?证书过期了不知道怎么复审延期
考电工证当地有考点如何操作?证书过期了不知道怎么复审延期

考电工证当地有考点如何操作?证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期?别慌,今天咱们就来聊一聊 考电工证当地有考点 这件事,顺便看看这个证的 含金量 到底有多高,以及你该怎么操作才能顺利延期。… · 2026/11/14 7:54:01

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43

有初级电工证怎么工作 2026河南最新政策怎么应对
有初级电工证怎么工作 2026河南最新政策怎么应对

有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31

为什么要低压电工证实操考试考什么
为什么要低压电工证实操考试考什么

为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码