LeetCode-Go 题解:1051. Height Checker 身高检查器——排序比对法求最小移动人数

发布时间:2026/11/12 11:22:04

LeetCode-Go 题解:1051. Height Checker 身高检查器——排序比对法求最小移动人数 LeetCode-Go 题解1051. Height Checker 身高检查器——排序比对法求最小移动人数【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇技术指南以 LeetCode-Go 仓库中 1051. Height Checker 的题解文档为核心完整讲解该题的题意、约束、解题思路、Go 实现与测试验证。读完本文你将掌握「排序 逐位比对」这一处理数组有序性问题的基础范式并能在 O(n log n) 时间内精确计算让数组变为非递减序列所需移动的最小人数同时了解仓库源码与测试的组织方式。题目回顾LeetCode 原题描述如下Students are asked to stand in non-decreasing order of heights for an annual photo. Return the minimum number of students that must move in order for all students to be standing in non-decreasing order of height.即学校拍年度纪念照时要求学生按照非递减non-decreasing的高度顺序排列。给定当前高度数组heights请返回能让所有学生以非递减高度排列所需的最小必要移动人数。题目还特别补充了一个关键条件Notice that when a group of students is selected they can reorder in any possible way between themselves and the non selected students remain on their seats.也就是说被选中的一组学生之间可以任意重新排序而未被选中的学生必须保持原位不动。这个条件决定了计数方式详见后文解题思路。数据约束约束项取值范围heights.length1 n 100heights[i]1 heights[i] 100数据规模极小最长 100 个元素、值域仅 1~100这意味 O(n log n) 甚至 O(n²) 的算法都能轻松通过但仓库采用了最标准的排序解法。三个官方示例示例 1Input: heights [1,1,4,2,1,3] Output: 3官方逐步推导如下Current array : [1,1,4,2,1,3] Target array : [1,1,1,2,3,4]索引 20 起始当前位置是4目标位置是1该学生必须移动索引 4当前位置是1目标位置是3该学生必须移动索引 5当前位置是3目标位置是4该学生必须移动。合计 3 人。注意索引 3 处2 2无需移动。示例 2Input: heights [5,1,2,3,4] Output: 5除5外的四个元素各差一位加上5本身五个位置全部错位答案为 5。示例 3Input: heights [1,2,3,4,5] Output: 0数组已经是有序的无需任何移动。解题思路排序 逐位比对为什么排序后逐位比对即可题目的约束是被选中的一组学生可以任意方式重排未被选中的保持不动。要让最终排列成为非递减序列最终形态必然是原数组排序后的结果——因为重排不改变学生集合只是调整顺序而非递减排列是唯一的值相等时位置可互换但计数结果不变。因此最少移动人数就是当前数组与排序后数组在相同下标上值不相等的个数。每发现一个错位就意味着该位置的学生必须被选中并参与重排。算法步骤复制一份heights数组作为对照对副本调用sort.Ints原地升序排序得到目标数组遍历原数组逐位与排序后的数组比较heights[i] ! checker[i]则计数加一返回计数值。仓库文档中给出的中文解题思路也精确地概括了这一过程简单题最少次数意味着每次移动一步到位一步就移动到它所在的最终位置。那么用一个辅助排好序的数组一一比对计数即可。仓库 Go 实现逐行解读仓库的实际实现位于 1051. Height Checker.go完整代码如下package leetcode import sort func heightChecker(heights []int) int { result, checker : 0, []int{} checker append(checker, heights...) sort.Ints(checker) for i : 0; i len(heights); i { if heights[i] ! checker[i] { result } } return result }逐行要点checker : []int{}与append(checker, heights...)这是本实现的关键技巧。append结合展开语法heights...会分配一块新的底层数组并把heights的全部元素拷贝进去从而避免直接checker : heights共享底层数组——那样排序会同时破坏原数组导致后续比对全部失效。从源码结构看这里采用先声明空切片再 append的写法与make([]int, len(heights))copy等价均实现了深拷贝。sort.Ints(checker)Go 标准库对[]int的原地升序排序排序完成后checker即目标非递减数组。逐位比对循环以len(heights)为界遍历一旦发现heights[i] ! checker[i]说明下标i位置的学生必须移动result。返回值result即最小必要移动人数。该实现不修改输入切片、不使用额外状态函数签名与 LeetCode 平台要求一致可直接在 OJ 上运行。单元测试验证仓库为本题编写了完整的表驱动测试位于 1051. Height Checker_test.go共覆盖 4 组用例输入heights期望输出说明[1,1,4,2,1,3]3官方示例 1[5,1,2,3,4]5官方示例 2[1,2,3,4,5]0官方示例 3已有序[5,4,3,2,1]4仓库补充的倒序用例测试代码采用该仓库统一的结构化用例组织方式type question1051 struct { para1051 ans1051 } // para 是参数 // one 代表第一个参数 type para1051 struct { one []int } // ans 是答案 // one 代表第一个答案 type ans1051 struct { one int }其中para1051封装输入参数、ans1051封装期望答案二者组合成question1051用例切片在Test_Problem1051中遍历断言。最后补充的倒序用例[5,4,3,2,1]很有教学价值排序后目标为[1,2,3,4,5]逐位比对只有 4 处不等中间值3恰好落在正确位置说明倒序数组 ≠ 全员移动印证了逐位比对计数而非按整体乱序程度估值的正确性。运行测试在仓库根目录执行标准 Go 测试命令即可验证本题实现仓库通过 gotest.sh 统一产出覆盖率文件其核心命令为go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...go test -v ./leetcode/ -run Test_Problem1051复杂度分析维度复杂度说明时间复杂度O(n log n)瓶颈是sort.Ints对 n 个元素排序比对阶段仅一次线性扫描 O(n)空间复杂度O(n)checker切片完整复制了一份输入数组在本题约束n ≤ 100下排序耗时可忽略不计这也是仓库选择标准排序解法的原因——代码简洁、语义清晰、易于验证。扩展思考优化方向利用值域做计数排序题目约束1 heights[i] 100意味着值域固定且很小可以进一步优化到 O(n 100) 的时间复杂度先统计每个高度值的出现频次再按值域顺序重建目标序列之后同样逐位比对计数。这样排序阶段不再是比较排序而退化为一次计数。不过该思路在 n ≤ 100 的场景下优势并不明显且会牺牲代码的直观性因此仓库保留了标准排序实现读者可在面试追问能否更快时作为加分项提出。同类题联想排序后与目标态比对的思想在数组类简单题中非常常见例如同样收录在本仓库 Array 专题 与 Sorting 专题 下的若干题目都涉及目标排列与当前排列的比较。掌握本题的深拷贝 → 排序 → 逐位比对三步范式可以迁移到身高、座位、评分等一切重排到有序状态求差异量的场景。参考文件索引题目文档本指南主体Go 实现源码单元测试仓库排序专题索引仓库数组专题索引仓库总 README题号索引【免费下载链接】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/12 8:21:31

SonarQube在Windows环境下的部署与代码质量管理实践

1. SonarQube核心价值解析SonarQube作为静态代码分析领域的标杆工具,其核心价值在于将代码质量管控从"事后检查"转变为"持续监测"。不同于传统IDE自带的代码检查功能,SonarQube通过独立服务的形式,实现了以下关键能力&am…

2026/11/9 23:38:09

水豚鼠标助手提升视频制作效率的5大技巧

1. 水豚鼠标助手在视频创作中的核心价值作为一名从业8年的视频制作人,我亲测过市面上绝大多数辅助工具,直到去年接触到水豚鼠标助手这款神器,我的视频制作效率直接提升了3倍。这款工具最惊艳的地方在于把鼠标操作变成了可视化创作元素&#x…

2026/11/12 21:40:03

府谷县酒店电工证多少钱 电工证报考门槛低不低

府谷县酒店电工证多少钱 电工证报考门槛低不低 学历不高怕报不上名,是不是你也在考虑报考府谷县酒店电工证?别急,下面这几点告诉你,其实报名门槛没有你想象的那么高,而且 府谷县酒店电工证多少钱 也并不是你想象中的天价。…

2026/11/12 21:40:03

电工证延期升级怎么报名?实操考试心里没底怕挂科别慌

电工证延期升级怎么报名?实操考试心里没底怕挂科别慌 你是不是正愁电工证延期升级怎么报名?实操考试心里没底怕挂科?别慌,这波操作你得听好了,今天就从头到尾给你捋清楚。 一、电工证延期升级到底是什么?你得先搞明白…

2026/11/12 21:40:03

西充建筑电工证怎么转异地保姆级教程

西充建筑电工证怎么转异地保姆级教程 之前考的证在外省能不能转过来?这个问题困扰了太多在外地打工、又想回老家发展的电工朋友。尤其是在西充本地,建筑电工证是从事建筑施工电气作业的必备资质,但很多人因为在外省考了证,想要回来用,却不知道怎么转。今…

2026/11/12 21:40:03

买卖电工证怎么判刑 考证前必须知道的报名陷阱

买卖电工证怎么判刑 考证前必须知道的报名陷阱 你是不是也遇到过这种情况?不知道怎么报名特种作业操作证,生怕一不小心被中介骗了钱还拿不到证。现在市场上打着“包过”“快速出证”旗号的中介太多,很多从业者甚至都不知道怎么报名,更别说搞清楚证书背后…

2026/11/12 20:35:13

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

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

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

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

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

2026/11/12 9:51:42

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
免费获取方案
☎咨询二维码 ☎ ↑