LeetCode-Go 题解:75. Sort Colors 荷兰国旗问题的三种 Go 实现(一次遍历游标法 / 计数排序 / 三路快排)

发布时间:2026/11/10 14:04:28

LeetCode-Go 题解:75. Sort Colors 荷兰国旗问题的三种 Go 实现(一次遍历游标法 / 计数排序 / 三路快排) LeetCode-Go 题解75. Sort Colors 荷兰国旗问题的三种 Go 实现一次遍历游标法 / 计数排序 / 三路快排【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读75. Sort Colors颜色分类是 LeetCode 上一道经典的原地排序题目数组元素只有0、1、2三类要求不使用库函数sort、在原地完成排序。本文以 leetcode/0075.Sort-Colors/README.md 为核心脉络结合 LeetCode-Go 仓库中 75. Sort Colors.go 的实际实现与其测试用例系统讲解一次遍历游标法、计数排序、三路快排三种解法并给出复杂度对比与可复现的运行验证方式。读完后你不仅能 AC 本题还能举一反三理解荷兰国旗问题这一快排分区思想的源头。题目回顾把 0、1、2 排成三段原题描述如下Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.即数组中的0代表红色、1代表白色、2代表蓝色要求原地排序使同色相邻、整体顺序为红 → 白 → 蓝。题目明确不允许调用库的排序函数。一个官方示例Input: [2,0,2,1,1,0] Output: [0,0,1,1,2,2]题目末尾的 Follow up 提出了更高的要求比较直接的思路是两遍扫描的计数排序第一遍统计0、1、2的个数第二遍按个数依次覆写数组更进一步能否设计出一趟扫描、只使用常数级额外空间的算法如文档题目大意所言这道题的抽象题意其实就是排序因此用快排思想一次通过也是完全可行的。解法一一次遍历游标法仓库实际实现针对 Follow up一次循环 常数空间的要求文档给出的核心思路是由于数字只会出现0、1、2三个值用游标移动控制写入顺序即可。具体逻辑是0排在最前面每添加一个0就需要顺势往后放置1和21排在2前面添加1时也要往后再放一个2至于2只需移动遍历游标。LeetCode-Go 仓库中 75. Sort Colors.go 正是这一思路的直接落地package leetcode func sortColors(nums []int) { zero, one : 0, 0 for i, n : range nums { nums[i] 2 if n 1 { nums[one] 1 one } if n 0 { nums[zero] 0 zero } } }逐行推演三个覆盖位的联动这里的两个指针含义非常精妙zero下一个0应写入的位置也是已排好0段的末尾one下一个1应写入的位置也是已排好0、1段的末尾。每遍历到一个元素n都先无条件把当前位置覆写为2把未知区当作2占位然后根据n的取值依次向前覆盖先写2nums[i] 2保证当前位置最终归属蓝段n 1时写1把one指向的位置写成1并前进one。由于新来的元素是0或1它要么替换掉刚才多写的2元素为1时要么为下一步的0腾位置元素为0时n 0时写0把zero指向的位置写成0并前进zero。因为zero始终不超过one所以写0时要么覆盖掉刚写的1要么覆盖掉最初写的2永远不会破坏已排好的前缀。以输入[2,0,2,1,1,0]为例走一遍in写入序列nums[i]2 后按序覆盖zeroone02[2]0010[0,2,2]1122[0,2,2]1131[0,1,2,2]1241[0,1,1,2,2]1350[0,0,1,1,2,2]24最终输出[0,0,1,1,2,2]与题目示例完全一致。该实现一趟遍历完成排序时间 O(n)、空间 O(1)且不借助任何额外数组满足 Follow up 的全部约束。测试用例验证仓库同目录下的 75. Sort Colors_test.go 通过表驱动测试覆盖了多个输入形态空数组[]→[]单元素[1]→[1]官方示例[2,0,2,1,1,0]→[0,0,1,1,2,2]长序列[2,0,1,1,2,0,2,1,2,0,0,0,1,2,2,2,0,1,1]→[0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2]。长用例特别验证了大量元素交错出现时游标覆盖逻辑仍能保证三段严格有序覆盖了空输入、退化输入与常规输入的边界情况。解法二两遍扫描的计数排序文档明确指出这道题可以用计数排序适合待排序数字很少的题目。思路是用一个容量为 3 的计数数组第一遍统计0、1、2各自出现的次数第二遍按先0后1再2的顺序把数组覆写回去。func sortColorsCounting(nums []int) { cnt : [3]int{} for _, n : range nums { cnt[n] } idx : 0 for v : 0; v 2; v { for ; cnt[v] 0; cnt[v]-- { nums[idx] v idx } } }时间复杂度 O(n)两遍线性扫描空间复杂度 O(K)其中K 3是取值种类的个数文档特别标注了这一题 K 3。当待排序数字的取值域远小于元素个数时计数排序在常数因子和可读性上都极具优势本题恰好只有三种取值计数数组小到可以退化为三个局部变量。解法三三路快排荷兰国旗问题的经典解法文档最后补充这道题也可以用一次三路快排。数组分为 3 部分第一个部分都是 0中间部分都是 1最后部分都是 2。三路快排Dutch National Flag迪杰斯特拉提出的荷兰国旗问题用三个指针维护三段边界func sortColors3Way(nums []int) { lo, hi, i : 0, len(nums)-1, 0 for i hi { switch nums[i] { case 0: nums[lo], nums[i] nums[i], nums[lo] lo i case 1: i case 2: nums[i], nums[hi] nums[hi], nums[i] hi-- } } }lo0段的右边界nums[:lo]全为0i当前扫描位置1直接跳过hi2段的左边界nums[hi1:]全为2。遇到2时与hi交换后不推进i因为换回来的元素可能还是2需要再次判断遇到0时与lo交换后i前进因为换回来的元素只可能是1。同样一趟完成时间 O(n)、空间 O(1)。这种三段分区的思想在仓库其他题目中也有体现例如 215. Kth Largest Element in an Array.go 中的partition函数就是快排分区的工程化应用配合随机化基准值把期望复杂度稳定在 O(n)两者互相印证三路分区是快排递归树中处理重复元素的基石。三种解法对比解法扫描次数时间复杂度空间复杂度特点一次遍历游标法仓库实现1O(n)O(1)代码最简覆盖式写入满足 Follow up计数排序2O(n)O(K)本题 K3思路直白适合取值域小的场景三路快排荷兰国旗1O(n)O(1)分区思想通用是快排处理重复值的原型三种解法的共同前提是元素取值只有 0、1、2 三种因此三段式的线性算法成为可能这也是为什么题目要特意禁止调用库排序函数——那会掩盖题目真正想考察的分区思想。在仓库中运行与验证仓库采用package leetcode统一组织所有题解本题目录 leetcode/0075.Sort-Colors 下包含解法文件、测试文件和本文对应的 README。本地验证方式# 运行该题单测含 -v 输出便于观察输入输出 go test -v ./leetcode/0075.Sort-Colors/ -run Test_Problem75 # 或者运行全部 leetcode 包测试并生成覆盖率文件 go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...第二条命令与仓库根目录 gotest.sh 的脚本逻辑一致也是该项目生成 coverage.txt 覆盖率文件的标准方式go.mod 声明了模块github.com/halfrost/LeetCode-Go与 Go 1.19 版本要求并通过对structures、template等子模块的replace指令完成本地依赖管理。小结75. Sort Colors是一道一题三解的高频面试题计数排序考察对取值域有限的洞察一次遍历游标法考察原地覆写与指针联动的设计能力三路快排则直指荷兰国旗问题的分区本质。LeetCode-Go 仓库选用游标法作为主解正是因为它以最少的代码同时满足了一趟扫描 常数空间的全部约束理解这段实现等于同时掌握了后续 Kth Largest、快排随机化等题目的底层思维。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/10 14:04:27

SeaTunnel与Gravitino集成实现元数据自动化管理

1. 项目概述:当数据管道遇上元数据自动化在数据工程领域,手动维护Schema一直是ETL开发中最繁琐的环节之一。最近SeaTunnel与Gravitino的深度集成,通过RestAPI实现了元数据的自动化管理,这个看似简单的技术组合实际上解决了数据管道…

2026/11/6 16:49:37

H指数解析:学术影响力计算与应用指南

1. H指数:学术影响力的量化标尺作为一名长期跟踪学术评价指标的科研工作者,我经常需要向同行解释H指数的精妙之处。这个看似简单的数字背后,蕴含着对学者研究质量的立体化评估逻辑。2005年由物理学家Jorge Hirsch提出的H指数,如今…

2026/11/10 13:59:34

遵义县电工证报考条件多少钱?别再交冤枉钱了

遵义县电工证报考条件多少钱?别再交冤枉钱了 怕考不过白交培训费?遵义县电工证报考条件你了解多少?别再被培训机构忽悠了,今天就给你讲清楚怎么考、多少钱、怎么防坑。 一、遵义县电工证报考条件多少钱?别被“低价陷阱”骗了…

2026/11/10 13:59:34

铜梁电工证报名入口在哪 手把手教你避坑多少钱

铜梁电工证报名入口在哪 手把手教你避坑多少钱 你是不是正愁不知道去哪报名铜梁电工证,生怕被中介骗钱?别急,今天就来聊聊铜梁电工证报名入口的那些事,顺便告诉你多少钱,还能帮你避坑! 一、铜梁电工证报名入口到底在哪?…

2026/11/10 13:59:34

办理电工证要指纹考前押题怎么拿?证书过期了不知道怎么复审延期

办理电工证要指纹考前押题怎么拿?证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期?你不是一个人。我见过太多电工从业者因为没及时复审,导致证书失效,工作受阻,甚至被单位辞退。今天就来聊聊【办理电工证要指纹】这个新流程,以及如何用【考…

2026/11/10 13:59:34

电工证如何注册账号?良心建议别踩这些坑

电工证如何注册账号?良心建议别踩这些坑 怕考不过白交培训费?电工证注册账号流程你真的了解吗?别被那些培训机构忽悠,今天从实战角度给你讲透彻。 为什么注册账号前必须搞清楚这些事…

2026/11/10 8:12:38

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

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

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑