LeetCode-Go 题解剖析:1030. Matrix Cells in Distance Order 的曼哈顿距离排序解法

发布时间:2026/9/13 9:05:56
LeetCode-Go 题解剖析:1030. Matrix Cells in Distance Order 的曼哈顿距离排序解法 LeetCode-Go 题解剖析1030. Matrix Cells in Distance Order 的曼哈顿距离排序解法【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go矩阵类题在 LeetCode 中非常常见而 1030. Matrix Cells in Distance Order按距离顺序排列矩阵单元格 是一道将“坐标遍历”与“距离排序”结合的经典问题。本文以当前仓库中该题目的题解文件 1030. Matrix Cells in Distance Order.go 及配套测试 1030. Matrix Cells in Distance Order_test.go 为主线完整讲解题目定义、曼哈顿距离的计算方式、桶排序计数排序解法的实现原理与复杂度分析并给出可直接运行的测试验证方法。读完本文你将掌握一套无需全局排序即可按曼哈顿距离组织矩阵单元格坐标的通用实现方案。题目定义与核心概念问题描述题目给出一个具有R行C列的矩阵其中的单元格具有整数坐标(r, c)满足0 r R且0 c C。此外给定矩阵中的一个单元格坐标(r0, c0)。要求返回矩阵中所有单元格的坐标并按照它们到(r0, c0)的距离从小到大排列。这里的距离是两单元格(r1, c1)与(r2, c2)之间的曼哈顿距离|r1 - r2| |c1 - c2|只要满足“距离从小到大”这一排序条件答案可以以任意顺序返回。也就是说同一距离层级内部的相对顺序不作要求这是后续桶排序解法得以成立的依据。曼哈顿距离在网格中走“直角折线”的距离曼哈顿距离又称“城市街区距离”它度量的是在只能沿水平、垂直方向移动的网格世界里从一点走到另一点所需的最少步数。对本题而言从(r0, c0)到任意单元格(r, c)的距离为dist |r - r0| |c - c0|这个距离天然是非负整数且最大值不超过R C级别这一离散且范围有限的特性使得我们可以用“桶”按距离直接分类单元格而无需调用排序算法。约束范围题目给出的约束条件参见原 README 的 Note 部分参数约束R1 R 100C1 C 100r00 r0 Rc00 c0 C矩阵规模最大为100 x 100 10000个单元格距离值的跨度也很小因此无论是基于排序还是基于桶的分类方案在时间复杂度上都是完全可接受的。示例分析原题 README 给出了三个典型示例仓库测试文件 1030. Matrix Cells in Distance Order_test.go 中完整覆盖了这三个用例示例 1R 1, C 2, r0 0, c0 0Input: R 1, C 2, r0 0, c0 0 Output: [[0,0],[0,1]]只有一个方向需要移动各单元格到起点的距离依次为[0, 1]。示例 2R 2, C 2, r0 0, c0 1Input: R 2, C 2, r0 0, c0 1 Output: [[0,1],[0,0],[1,1],[1,0]]各单元格距离为[0, 1, 1, 2]。注意(0,0)与(1,1)的距离都是1它们的先后顺序并不强制所以输出[[0,1],[1,1],[0,0],[1,0]]同样被接受。示例 3R 2, C 3, r0 1, c0 2Input: R 2, C 3, r0 1, c0 2 Output: [[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]各单元格距离为[0, 1, 1, 2, 2, 3]其中距离1与距离2各有两个单元格同距离层内顺序可任意因此[[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]也是合法答案。解法一暴力计算 排序直观思路最容易想到的思路是两层循环枚举全部单元格逐一计算每个点到(r0, c0)的曼哈顿距离将坐标连同距离组成结构体存入切片最后按距离字段排序并提取坐标。时间复杂度枚举R x C个单元格需要O(R·C)排序需要O(R·C·log(R·C))总复杂度为O(R·C·log(R·C))。空间复杂度O(R·C)用于保存带距离信息的坐标切片。这种解法逻辑直白、易于编写但引入了一次不必要的全局排序。注意到距离值本身范围很小不超过R C完全可以用更高效的桶分类替代排序。解法二桶排序计数排序——仓库实现的核心思路仓库中的官方题解 1030. Matrix Cells in Distance Order.go 采用了**桶排序Bucket Sort / Counting Sort**思想整体分为三步计算距离上界、按距离装桶、按桶序拼接结果。下面逐段拆解。第一步计算最大距离确定桶的数量longRow, longCol, result : max(abs(r0-0), abs(R-r0)), max(abs(c0-0), abs(C-c0)), make([][]int, 0) maxDistance : longRow longCol bucket : make([][][]int, maxDistance1)关键点在于如何确定需要多少个桶。maxDistance是矩阵内任意单元格到(r0, c0)的最大曼哈顿距离行方向上的最大偏移量为max(abs(r0-0), abs(R-r0))即起点到首行与到末行的较远者列方向上的最大偏移量为max(abs(c0-0), abs(C-c0))即起点到首列与到末列的较远者两者相加即为行、列方向同时取最大偏移时的曼哈顿距离上界maxDistance。随后创建长度为maxDistance1的桶数组bucket下标i对应“距离为i的所有单元格”并逐一初始化为空切片。这一做法的精妙之处在于不需要对所有坐标做比较排序而是利用曼哈顿距离是范围有限的离散整数这一性质把“排序”退化为“分类”。第二步遍历全矩阵按距离装入对应桶for r : 0; r R; r { for c : 0; c C; c { distance : abs(r-r0) abs(c-c0) tmp : []int{r, c} bucket[distance] append(bucket[distance], tmp) } }两层循环完整遍历R x C个单元格对每个单元格计算曼哈顿距离abs(r-r0) abs(c-c0)然后把坐标[r, c]追加到bucket[distance]中。同一距离层内的单元格在桶内保持遍历顺序由于题目只要求按距离递增桶内顺序无需额外整理。第三步按距离从 0 到 maxDistance 顺序拼接结果for i : 0; i maxDistance; i { for _, buk : range bucket[i] { result append(result, buk) } }从距离0开始依次把每个桶内的坐标全部追加进结果切片。因为桶数组的下标天然递增拼接出的结果自然满足“距离从小到大”的全局顺序要求。辅助函数题解中还实现了两个基础工具函数func max(a int, b int) int { if a b { return a } return b } func abs(a int) int { if a 0 { return a } return -a }abs用于计算坐标差的绝对值max用于求行、列方向上的最大偏移。这两个函数在本题解文件中是包内私有实现与仓库中其他题解互不冲突。复杂度分析时间复杂度O(R·C)。两层循环遍历全部单元格是O(R·C)桶的数量maxDistance1不超过O(RC)拼接阶段遍历每个桶及其中元素总工作量仍是O(R·C)。相比先排序再输出的O(R·C·log(R·C))桶排序省去了对数因子。空间复杂度O(R·C)。bucket中保存了全部R·C个坐标引用结果切片result同样容纳全部坐标两者合计仍为O(R·C)量级。测试用例与运行验证仓库为本题提供了完整的单元测试文件 1030. Matrix Cells in Distance Order_test.go采用仓库统一的“题目参数 期望答案”结构体模式组织用例type para1030 struct { R int C int r0 int c0 int } type ans1030 struct { one [][]int }测试函数Test_Problem1030将 README 中的三个示例一一映射为测试数据并调用allCellsDistOrder(p.R, p.C, p.r0, p.c0)验证输出qs : []question1030{ {para1030{1, 2, 0, 0}, ans1030{[][]int{{0, 0}, {0, 1}}}}, {para1030{2, 2, 0, 1}, ans1030{[][]int{{0, 1}, {0, 0}, {1, 1}, {1, 0}}}}, {para1030{2, 3, 1, 2}, ans1030{[][]int{{1, 2}, {0, 2}, {1, 1}, {0, 1}, {1, 0}, {0, 0}}}}, }在仓库根目录下可以只针对本题运行测试go test -v ./leetcode/1030.Matrix-Cells-in-Distance-Order/...也可以按仓库约定运行全量测试并生成覆盖率文件参见 gotest.shgo test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...仓库go.mod声明模块github.com/halfrost/LeetCode-Go使用 Go 1.19 及以上版本即可编译运行参见 go.mod。测试运行时会在终端打印每组输入的【input】与【output】便于人工核对三种示例的输出顺序均满足“距离递增”的约束。小结本题的核心是理解“曼哈顿距离是范围有限的离散整数”从而可以跳出“排序”思维改用桶分类实现O(R·C)的线性解法。仓库实现 1030. Matrix Cells in Distance Order.go 通过“计算最大距离确定桶数 → 全矩阵遍历装桶 → 按桶序拼接”三步完成求解其配套测试完整覆盖了题目全部示例。这种“用下标天然有序的桶替代比较排序”的技巧同样适用于其他距离或频次范围有限的统计与排序问题值得举一反三。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询