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

LeetCode 75题:荷兰国旗问题与三指针排序算法

发布时间:2026/11/3 20:52:12 来源:云帆数科 栏目:资讯中心
LeetCode 75题:荷兰国旗问题与三指针排序算法
1. 问题背景与核心需求这道题目来自著名的LeetCode Hot 100系列编号75题颜色分类(Sort Colors)。作为算法面试中的经典问题它要求我们原地(in-place)对包含红、白、蓝三种颜色的数组进行排序其中用0、1、2分别代表这三种颜色。在实际开发中这类问题常见于图像处理领域。比如在Photoshop等软件中当我们需要对像素点的RGB值进行特定排序时就会遇到类似的场景。题目给出的约束条件——只能使用常数空间且必须一趟扫描完成——模拟了内存受限环境下的真实需求。2. 算法思路解析2.1 暴力解法的局限性最直观的解法是直接调用语言内置的排序函数但这显然违背了题目考察的本意。另一种思路是两次遍历第一次统计0、1、2的个数第二次重写数组。虽然时间复杂度是O(n)但需要两趟扫描。2.2 荷兰国旗问题这道题实际上是经典的荷兰国旗问题的变种由计算机科学家Edsger Dijkstra提出。核心思想是通过三个指针将数组划分为三个区域left指针左侧全是0right指针右侧全是2中间是未处理的12.3 单次遍历算法最优解采用三指针法只需要一次遍历初始化left0, rightn-1, current0当current right时循环如果nums[current]0交换到left位置left, current如果nums[current]2交换到right位置right--如果是1current这个算法的时间复杂度是O(n)空间复杂度O(1)完美满足题目要求。3. 代码实现与细节3.1 Python实现示例def sortColors(nums): left, right 0, len(nums) - 1 current 0 while current right: if nums[current] 0: nums[left], nums[current] nums[current], nums[left] left 1 current 1 elif nums[current] 2: nums[right], nums[current] nums[current], nums[right] right - 1 else: current 13.2 关键点说明边界条件处理当current超过right时终止循环交换逻辑0往左交换后current可以前进因为左边已经处理过2往右交换后current不能前进因为交换过来的元素还未检查1的处理直接跳过让中间自然形成1的区域4. 算法正确性证明我们可以用循环不变式来证明这个算法的正确性初始化三个区域都为空满足条件 保持每次遇到0交换到left位置保证left左侧全是0每次遇到2交换到right位置保证right右侧全是2遇到1不做处理自然留在中间 终止current right时所有元素都已处理5. 变种与扩展5.1 四色排序问题如果颜色增加到四种同样可以使用类似的多指针方法解决。需要维护三个分界点将数组分为四个区域。5.2 部分有序情况如果数组已经部分有序算法依然有效但可以考虑优化提前终止的条件。5.3 实际应用场景这种算法在操作系统内存管理、数据库索引维护等需要高效原地排序的场景都有应用价值。6. 常见错误与调试技巧6.1 典型错误模式交换2之后current也增加会导致漏检交换过来的元素边界条件错误current应该与right比较而非数组长度指针移动顺序错误left和current的移动需要协调6.2 调试建议可以打印每次交换后的数组状态和指针位置观察分区是否正确形成。对于小数组如[2,0,1]要特别注意边界情况。7. 性能优化思考虽然算法已经是理论最优但在实际实现中还可以考虑使用位运算代替交换操作对于大规模数据可以考虑并行化处理在特定硬件架构下优化内存访问模式8. 面试技巧遇到这类问题时建议先明确问题约束条件从暴力解法开始逐步优化画图说明指针移动过程讨论时间/空间复杂度考虑边界情况和测试用例这道题很好地考察了候选人对指针操作和原地算法的掌握程度是面试中的高频考点。理解其背后的荷兰国旗问题本质有助于举一反三解决类似的数组分区问题。

相关推荐

Java简答题库面试自测:从八股文到代码验证的知识地图
Java简答题库面试自测:从八股文到代码验证的知识地图

简介:这份《Java 简答题》文档面向 Java 初学者、在校学生及准备笔试面试的开发者,围绕常见简答题提供条理化参考答案,可用于课堂复习、考前背诵与面试自测。压缩包内共 1 个 doc 文件,约 60KB,内容按主题组织&#xf… · 2026/11/3 20:51:12

QDNet:端到端视觉知识图谱生成技术解析
QDNet:端到端视觉知识图谱生成技术解析

1. QDNet:视觉交通知识图谱生成的革命性突破去年在部署某城市智慧交通系统时,我们团队曾为跨摄像头车辆追踪问题头疼不已。传统方法需要分别训练目标检测、ReID和关联模型,不仅流程繁琐,各模块间的信息损失更导致最终效果大打折扣… · 2026/11/3 20:51:12

Oracle ORA-12504:SERVICE_NAME 缺失排查指南
Oracle ORA-12504:SERVICE_NAME 缺失排查指南

上周又被拉去看一个问题:PL/SQL Developer 里点登录,弹出一行ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA。坐在旁边的人已经试了半小时——重装客户端、改密码、甚至怀疑远程库挂了。我扫了一眼他的 tnsnames.ora&#xf… · 2026/11/3 20:51:12

教育平台LaTeX公式渲染技术解析与优化实践
教育平台LaTeX公式渲染技术解析与优化实践

1. 教育平台LaTeX公式渲染的技术挑战在教育类Web应用中,数学公式的编辑与展示一直是技术实现的难点。传统方案通常采用图片嵌入方式,但这会导致内容不可搜索、无法动态修改、显示效果模糊等问题。LaTeX作为科研领域的标准排版工具,其数学公式… · 2026/11/3 21:28:39

Microsoft Project排程与基准管理:从任务逻辑到偏差控制的完整指南
Microsoft Project排程与基准管理:从任务逻辑到偏差控制的完整指南

项目管理这件事,工具只是载体,真正决定成败的是你对任务逻辑和基准控制的理解。Microsoft Project 这款软件在进度管理圈子里被讨论得很多,但大多数人只把它当成一个画甘特图的工具,装完软件、拉几条任务、连上箭头,导… · 2026/11/3 21:28:39

工业自动化中的程序控制语句应用与优化
工业自动化中的程序控制语句应用与优化

1. 程序控制语句概述程序控制语句是编程语言中用于控制代码执行流程的核心语法结构。就像交通信号灯指挥车辆行驶方向一样,控制语句决定了程序代码的执行顺序和逻辑分支。在实际工程中,约60%的代码逻辑都依赖于各种控制语句的组合使用。以工业自动化领域… · 2026/11/3 21:28:39

AI模仿与人类独特性:技术边界与认知突破
AI模仿与人类独特性:技术边界与认知突破

1. 项目概述:机器模仿与人类独特性认知"当机器学会模仿,人类才真正开始理解独特"这个标题揭示了人工智能时代一个深刻悖论。作为一名长期观察AI与人类认知交互的研究者,我发现在机器学习技术突飞猛进的今天,我们反而对人… · 2026/11/3 21:28:39

高性价比人生指南:时间、金钱与精力的资源配置方法论
高性价比人生指南:时间、金钱与精力的资源配置方法论

1. 为什么“高性价比”才是普通人最该盯住的变量“高性价比人生指南”这个标题第一次看到的时候,我脑子里冒出来的不是鸡汤,而是一张成本收益表。这些年我见过太多人把“过好这一生”当成一个玄学问题,要么归因于运气,要么归因于出… · 2026/11/3 21:28:39

Vue el-switch 列表开关全部关闭的排查与规范写法
Vue el-switch 列表开关全部关闭的排查与规范写法

一个后台管理页的列表,四十多行数据,每行右侧一个 el-switch 控制启用状态。接口返回里 status 明明白白地 1 和 0 混着,但页面上四十几个开关齐刷刷全是灰的,一个都没亮。这种"vue el-switch 列表开关状态显示有误、全部关闭… · 2026/11/3 21:27:39

双极步进电机控制实战: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/2 13:10:28

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/3 6:04:24

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/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战: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/2 13:10:28

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/3 6:04:24

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/3 5:52:46

了解更多?预约专属演示

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

企业微信二维码