LeetCode 883 三维形体投影面积:用二维数组统计替代3D建模
开头LeetCode 883Projection Area of 3D Shapes翻译过来叫“三维形体投影面积”属于那种题目名字听着很难、实际做起来却很友好的类型。它给你一个 n×n 的二维数组 grid每个格子的数值表示这个位置上堆叠了几个 1×1×1 的立方体让你求这个立体造型在 xy、yz、zx 三个方向上的投影面积之和。我第一次看到“三维形体”四个字第一反应是“是不是要建模是不是要搞立体几何那一套”结果仔细读完题才发现这题的核心压根不在三维而在二维数组上怎么高效做三类统计。我做完提交之后在自己的刷题笔记里标了一句“耗时 100”指的就是这类题哪怕数据拉满实际运行时间也就几十毫秒量级完全不需要焦虑。这篇博客就围绕“从 3D 到 2D 的转化”来拆手把手把三种投影分别对应什么统计、代码怎么写、有哪些坑可以提前绕开一次性讲透。适合刚开始刷数组模拟题的同学也适合想从这题延伸出去、把一类“网格统计”题串起来复习的人。1. 三个投影方向怎么理解别被“3D”两个字吓住1.1 用搭积木的方式想清楚三个视图这题最劝退的地方是“三维形体投影面积”这个名字听起来像要做空间几何实际题目给你的是一个二维数组。我自己习惯把 grid[i][j] 想象成一堆积木第 i 行第 j 列的格子上叠了 grid[i][j] 个 1×1×1 的小方块。一个格子可能是空的值为 0也可能叠了 1 块、2 块、甚至 50 块。现在你站在三个不同的方向去看这堆积木问你能看到的“影子”面积加起来是多少。第一个方向是俯视也就是从正上方往下看。这时候不管一个格子上叠了 3 块还是 5 块你看到的都是同一个 1×1 的顶面。只要这个格子的值不是 0就在俯视图上占一个格子。所以俯视图的面积就是数组里非零元素的个数。注意这里不是把每个格子的数值加起来数值加起来那是体积不是投影面积。第一次做这题的人十个里有八个会在这里卡一下。第二个方向是从侧面看也就是沿 y 轴方向看过去。你看到的其实是每一行的轮廓线。对于同一行来说后面柱子无论多高只要前面有一根更高的柱子挡着你就看不到后面的顶。换句话说这一行在侧视图上的“高度”取决于这一行所有元素的最大值。把所有行的最大值加起来就是这一面投影的面积。第三个方向是从正面另一个侧面看过去沿 x 轴方向看。道理完全一样只是这次换成按列来看每一列的最高值决定了这一列在正视图上的高度。把每一列的最大值加起来就是这一面投影的面积。为了让你彻底记住这三个统计量我把它整理成了下面这张对照表投影方向你需要统计什么为什么xy 平面俯视所有非零格子的数量从上往下看堆多高都只占一个格子yz 平面侧视每一行的最大值之和沿行方向看去最高柱子挡住后面所有矮柱子zx 平面正视每一列的最大值之和沿列方向看去最高柱子决定这列的轮廓高度1.2 为什么不需要真的建三维模型很多人看到这种题会想那我是不是得开一个三维数组把每个格子的小立方体都存进去再模拟光线照射完全不用而且这么做只会把你的代码写复杂还可能超时。所有投影面积都可以直接从原始二维数组里算出来不需要任何中间结构。用数学语言写一下就更清楚了。假设 grid 是一个 n×n 的矩阵那么xy 方向投影面积 count(grid[i][j] 0)yz 方向投影面积 sum(max(grid[i][j] for j in range(n)) for i in range(n))zx 方向投影面积 sum(max(grid[i][j] for i in range(n)) for j in range(n))最终答案就是这三项相加。整道题的本质就是把一个“看起来很立体”的问题翻译成三个“非常平面”的数组统计问题非零计数、行最大值求和、列最大值求和。你现在应该能感觉到这题真正考的是你能不能快速把一个几何概念映射到数组操作上一旦映射完成代码量可以非常小。我们拿题目里最经典的示例手算一遍grid [[1,2],[3,4]]。俯视图四个格子全非零得到 4。侧视图第一行 [1,2] 最大值是 2第二行 [3,4] 最大值是 4加起来是 6。正视图第一列 [1,3] 最大值是 3第二列 [2,4] 最大值是 4加起来是 7。所以总答案 4 6 7 17。如果这里你算出来不是 17说明某个方向的统计逻辑理解偏了建议重新对着表格核一遍。再来一个带零的示例grid [[1,0],[0,2]]。俯视图非零格子是 (0,0) 和 (1,1)共 2 个。侧视图第一行最大值 1第二行最大值 2和是 3。正视图第一列最大值 1因为 [1,0]第二列最大值 2因为 [0,2]和是 3。总答案 2 3 3 8。这个示例特别适合检验你是否真的理解了“俯视图算个数而不是算总和”你把两个数加起来能得到 3但那不是投影面积。2. 关键细节行最大和列最大怎么一次遍历拿全2.1 同一个内层循环里同时处理行和列思路清楚了之后代码怎么写就成了下一个问题。最直观的办法是写三个循环第一个循环数非零个数第二个循环算行最大第三个循环算列最大。这么做完全没问题时间复杂度也不会变只是代码会长一点。但如果你仔细观察题目条件会发现grid 是一个方阵行数和列数相等。这意味着你可以在同一个双重循环里通过交换下标同时取到“当前行的元素”和“当前列的元素”。具体来说外层循环变量 i 遍历每一行内层循环变量 j 遍历每一列。那么 grid[i][j] 就是第 i 行第 j 列的元素grid[j][i] 就是第 j 行第 i 列的元素也就是第 i 列上的第 j 个元素。于是你在一次内层循环里可以同时维护两个最大值一个是行最大值 rowMax一个是列最大值 colMax。核心伪代码的骨架长这样for i in range(n):rowMax 0colMax 0for j in range(n):if grid[i][j] 0: ans 1rowMax max(rowMax, grid[i][j])colMax max(colMax, grid[j][i])ans rowMax colMax这个写法把三次数组遍历压成了一次代码量少可读性也没有下降。我第一次提交的时候用的是“先数非零再单独算两个最大值”的三个循环写法后来发现一次遍历明显更清爽也更符合这类题的惯用解法。这里最值得注意的是 colMax 那一行里面的下标顺序。很多人写到这里容易顺手写成 max(colMax, grid[i][j])那实际上是在算“行的最大值”只不过把它硬命名为 colMax。如果这么写代码不会报错样例也能过但一旦遇到行和列最大值分布不均匀的用例答案就会错。要理解这个下标交换可以这样记你是在以一个方阵的视角同时“横着看”和“竖着看”横着看是 grid[i][j]i 不动j 在动竖着看就必须把 j 当作行、i 当作列所以是 grid[j][i]。2.2 边界条件、数据范围和防御性写法聊完核心遍历再来看看那些平时不起眼、但真出问题会很头疼的边界细节。先说数据范围。题目给出的约束是 1 ≤ n ≤ 50且 grid[i][j] 的取值范围在 1 到 50 之间格子为 0 表示空。按照这个约束答案的最大值是可以估算的俯视图最多 n×n 也就是 2500 个非零格子行最大之和最多 50 行 × 50 2500列最大之和同样最多 2500三项合计最大 7500。这个量级用 int 存储绰绰有余完全不需要担心溢出。这里可以放心用 int 作为返回值类型。再考虑空数组的极端情况。题目本身交代了 grid 是方阵且 n≥1但是如果你把这段逻辑抽成一个工具函数放到别的项目里复用那 grid 为空的情况是可能发生的。安全起见我习惯在函数开头加一行防御性判断if (grid.empty()) return 0;。这个判断不会影响正常提交但在面试场景里属于加分项能够体现你对输入边界的敏感度。还有一个细节是“非零”判断的写法。因为本题所有有效值都是正数所以写 grid[i][j] 0 和 grid[i][j] ! 0 结果一样。但从通用性角度看如果某天数据源里出现了负数 0 依然能正确表达“有方块”而 ! 0 就会误判。我个人的习惯是一律写 0既符合语义也不用担心未来数据格式变化。3. 代码实现C、Python、Java 三版对照3.1 C 版本与逐行解释先给出我最常用的一版 C 实现代码短到你几乎不需要记class Solution { public: int projectionArea(vectorvectorint grid) { int n grid.size(); int ans 0; for (int i 0; i n; i) { int rowMax 0, colMax 0; for (int j 0; j n; j) { if (grid[i][j] 0) ans; rowMax max(rowMax, grid[i][j]); colMax max(colMax, grid[j][i]); } ans rowMax colMax; } return ans; } };这版代码的逻辑非常直白。外层循环每处理完一行就把这一行的行最大值和这一列的列最大值累加到答案里。之所以选择在每一行结束时统一加一次而不是在内层循环里不断累加是为了避免重复统计。你可以在内层循环里做 max 更新但 ans 的累加放在行结尾更清晰因为每个 rowMax 和 colMax 都是一行/列一轮循环的产物。C 版本要注意的是函数形参使用的是 vectorvector 引用传递这样避免了整个二维数组的拷贝。如果你不小心写成了 vectorvector grid每次调用都会复制一份数组虽然 n 很小看不出问题但工程习惯上引用传递更专业。3.2 Python 版本与逐行解释Python 写起来更短也更贴合伪代码class Solution: def projectionArea(self, grid: List[List[int]]) - int: n len(grid) ans 0 for i in range(n): row_max 0 col_max 0 for j in range(n): if grid[i][j] 0: ans 1 row_max max(row_max, grid[i][j]) col_max max(col_max, grid[j][i]) ans row_max col_max return ans需要提醒一点Python 内置的 max 函数在调用时会有一点额外开销但在这个题的规模下完全不用在意。相比性能我更看重代码的可读性这里直接使用 max 比手写 if 判断要清晰得多。如果你追求更“函数式”的写法还可以用 zip 把列拆出来单独算xy sum(1 for row in grid for v in row if v 0) yz sum(max(row) for row in grid) zx sum(max(col) for col in zip(*grid)) return xy yz zx这个写法很短适合讨论思路时使用但是实际提交时我更推荐上面那种一次循环的版本因为对初学者来说理解和维护成本更低。3.3 Java 版本与复杂度总结Java 版本和 C 几乎一一对应class Solution { public int projectionArea(int[][] grid) { int n grid.length; int ans 0; for (int i 0; i n; i) { int rowMax 0, colMax 0; for (int j 0; j n; j) { if (grid[i][j] 0) ans; rowMax Math.max(rowMax, grid[i][j]); colMax Math.max(colMax, grid[j][i]); } ans rowMax colMax; } return ans; } }三种语言的思路完全一致也是这类题的通用解法。复杂度方面由于我们必须遍历整个 n×n 数组的每一个元素才能完成统计时间复杂度最优就是 O(n^2)不可能更低。空间上只用了几个临时变量所以是 O(1) 的额外空间。把关键信息整理成表语言时间复杂度空间复杂度实现要点CO(n^2)O(1)引用传参避免拷贝PythonO(n^2)O(1)同一循环里算行、列最大JavaO(n^2)O(1)Math.max 与下标交换4. 常见问题与排查技巧实录4.1 把俯视图面积算成体积这条算是我见过最多的错误没有之一。很多刚接触这个题的人看到 grid[i][j] 是非零值就顺手 ans grid[i][j]然后嘴里还念叨“这不是投影面积吗”。这样算出来的其实是整个三维形体的体积而不是俯视图的投影面积。想象你站在一栋楼顶往下看不管这栋楼是三层还是三十层你在平面图上看到的地基轮廓都是一样的。俯视图只关心“有没有建筑”不关心建筑有多高。正确的做法是只对非零格子计数也就是 if (grid[i][j] 0) ans。如果你担心自己混淆我提供一个验证手段拿一个含 0 的用例去跑看结果是否符合预期。比如 grid [[1,0],[0,2]]正确答案是 8。如果某个解法输出 3那它大概率把俯视图做成了非零计数但把体积误当投影或者干脆统计错方向了。4.2 列最大值的下标写错第二个高频 bug 是 colMax 的更新写成 grid[i][j] 而不是 grid[j][i]。这个错误很隐蔽因为小规模样例很容易误打误撞通过。比如 grid [[1,2],[3,4]] 这种行列对称性较好的数据行最大之和等于列最大之和你甚至不会发现哪里算错了。但一旦遇到 grid [[1,1],[3,4]]行最大之和是 1 4 5列最大之和是 3 4 7两者不相等写错下标时答案就会偏小。排查这种问题最快的方法是写一个 2×2 或 3×3 的随机数组手动算出期望答案再和代码输出对照。如果发现正视图方向偏小优先检查下标是否交换了。我自己的经验是凡是涉及“行列同时统计”的题目写完之后先检查一次所有下标这种检查成本极低但能省下很多调试时间。4.3 “耗时 100”背后的性能执念标题里的“耗时 100”在刷题圈通常指某次提交运行耗时在 100ms 附近或者是自己给自己定的一个目标希望把耗时压进 100ms 以内。对于这道题而言这个目标相当保守。即便网格是 50×50 的满数据需要处理的数据点也只有 2500 个三个统计量在一次双重循环里就能全部算完实际运行时间通常在个位数毫秒到几十毫秒之间波动而平台耗时还受服务器负载、网络传输等外部因素影响。如果你真的希望把耗时压到尽可能低可以从三个方向优化第一避免在循环内部调用过于复杂的库函数比如每次都重新创建容器第二传参使用引用而不是值传递第三把可以提前结束的统计合并到同一轮循环里。但说实话这些优化在这个题里都属于锦上添花最重要的还是保证算法复杂度正确。我刷题很少看每次提交的毫秒数因为同一个代码在不同时段提交可能差出一倍过度追求那个数字没有意义。4.4 常见错误速查表错误现象根本原因解决办法最终答案比正确值大很多把俯视图面积算成了所有格子数值之和改成只对 0 的格子计数答案偏小且只差列方向的统计正视图的 colMax 用了 grid[i][j]换成 grid[j][i] 取同一列的遍历空数组报错或越界没处理 grid.empty() 的场景函数开头加 if(grid.empty()) return 0答案溢出或者类型太窄忽略了 n 和数值上限这题用 int 即可答案上限约 7500运行时间不稳定在循环里复制了数组或频繁创建对象用引用/指针传递避免无谓的内存分配5. 同一套思路能解的同类题5.1 与 807 的关系在最大值上做文章如果你觉得这题太简单还想再巩固一下“网格统计”的手感最值得做的下一题是 807 Max Increase to Keep City Skyline翻译过来是“保持城市天际线的最大增高”。那道题同样用到了行最大值和列最大值只不过反过来让你思考在不改变某个方向天际线的条件下每个格子最多能增加多少高度。核心思路是先算每行最大值和每列最大值然后遍历每个格子它能提升到的最高高度是 min(rowMax[i], colMax[j])提升量就是 min 和当前值之间的差值。你看整个过程和 883 共用了一套预处理逻辑行最大、列最大。所以如果 883 的代码你能闭着眼写出来807 几乎等于换个场景再考一遍同一个模板。5.2 与 463、766 的差异网格统计的通用套路除了 807网格题里还有一类是统计相邻关系或对角线关系比如 463 岛屿的周长、766 托普利茨矩阵。这类题看起来和 883 不一样但底层的思考方式是一致的你先确定要统计的目标再决定是在一次遍历中完成还是多次遍历。比如 463 求岛屿周长本质上是在数“哪些边是外边”你可以遍历每个格子每遇到一个陆地格子就加 4然后如果右方或下方也是陆地就减去 2。再比如 766 判断所有对角线上的元素是否相等你只需要检查每个格子和它右下方的格子是否相同。这些题的共性是它们都要求你在二维数组的框架下把“形状”问题转化为“数值关系”问题。我把这类题串起来之后总结出一个自己的训练模板第一步明确要统计的行、列、对角线或相邻关系第二步考虑能否用一次双重循环同时完成所有统计第三步注意下标映射尤其是行列互换、对角线偏移第四步处理空数组和单一行/列的边界条件。按这个模板去刷数组模拟类的 easy 题基本都能在几分钟内找到方向。做这道 883 时我最大的一个体会是很多看起来很酷的几何问题拆开之后骨架其实特别朴素。你不需要会三维建模也不需要懂光线追踪只要老老实实把一个二维数组横着看一遍、竖着看一遍答案就出来了。如果你正在为“题目看半天不知道在说什么”而苦恼我的建议是先别急着看题解拿出一张纸画一个 2×2 的格子给每个格子填上高度然后分别从三个方向画一下你能看到的轮廓。画完之后你会发现代码只是把画图的过程翻译成了 for 循环而已。另外一个值得养成的习惯是这类简单题写完后花 30 秒想想“是否能推广到非方阵”虽然这道题限制了 n×n但思考的过程会让你的数组功底更扎实。

相关新闻

文档提炼提示词实战:九个维度模板实现AI结构化摘要

文档提炼提示词实战:九个维度模板实现AI结构化摘要

1. 为什么你的文档提炼提示词总是不好用:先看清问题出在哪 我接触过不少整理资料的人,也看过大量所谓的“文档提炼提示词”,一个很普遍的现状是:模板堆了一长串,规则也写得天花乱坠,真正丢进对话窗口一测试…

2026/10/16 9:53:39 阅读更多 →
双目立体标定与校正实战:从棋盘格采集到共面行对准

双目立体标定与校正实战:从棋盘格采集到共面行对准

简介:本资源是一套基于OpenCV 3.0与Visual Studio 2013实现的双目视觉立体标定与校正完整工程,面向计算机视觉初学者、机器人感知方向学习者及三维重建实践者,解决双目相机系统参数标定、极线校正等核心问题,为后续立体匹配与深度…

2026/10/16 9:52:37 阅读更多 →
栈数据结构详解:从LIFO原理到工程实践与算法应用

栈数据结构详解:从LIFO原理到工程实践与算法应用

1. 为什么这个基础数据结构,值得你专门花时间研究 先说个我自己的体验。早年做某项目时,需要解析一串包含多层嵌套括号的配置文本,校验用户输入的合法性。第一次顺手用计数器统计左右括号数量,看起来能通,可一旦括号顺…

2026/10/16 9:52:37 阅读更多 →

最新新闻

C#面向对象:Person类、Student类继承与构造函数全解析

C#面向对象:Person类、Student类继承与构造函数全解析

1. 面向对象的第一步:从Person类的设计说起很多人学C#敲的第一段面向对象代码,就是从定义人类Person开始的。这个题目看着简单,但背后其实藏着一堆值得掰扯清楚的细节——构造函数怎么写、字段和属性有什么区别、继承之后构造函数怎么联动。我…

2026/10/16 10:41:46 阅读更多 →
Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

简介:本资源是 Tailwind CSS 6.23 版本的完整组件实践包,面向前端开发者、UI 工程师及响应式项目快速搭建者,解决传统 CSS 开发效率低、定制难、响应式适配繁琐等痛点。压缩包含 2007 个文件,主体为 1304 个 HTML 示例页&#xff…

2026/10/16 10:41:46 阅读更多 →
线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

前阵子处理一段传感器信号时,我遇到一个特别典型的困境:数据里明明有很关键的局部小峰值,结果一用常规的滑动平均去噪,峰值幅度被削掉一大半,位置还往后偏移了好几个采样点。后来换成线性加权滑移平均算法,…

2026/10/16 10:41:46 阅读更多 →
用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

从小我就觉得粒子特效是门“骗术”:喷泉喷的是水,火焰烧的是粒子,但只要观感对了,没人会在意那是不是真的流体。喷泉那一篇发出来后,不少人问我能不能把发射器关掉重力、换个橙色贴图,直接当火焰用。我的回…

2026/10/16 10:41:46 阅读更多 →
Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

系统突然出现“Utilman.exe文件丢失或找不到”的报错,登录界面右下角的“轻松使用”按钮点了没反应,甚至开机就卡在欢迎界面。这个问题在Windows 7到Windows 11上都可能出现,不少朋友第一反应是去第三方下载站找个exe文件补上——我劝你千万打…

2026/10/16 10:41:46 阅读更多 →
AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

这个标题是我在刷开源社区动态的时候看到的,第一反应是“又来了个套壳项目”,但点进去翻了源码和论文之后,我承认我小看它了。这个项目目前在 GitHub 上拿下了 31.2K Star,热度确实不是刷出来的。我花了两天时间把它部署到本地&am…

2026/10/16 10:40:41 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →