LeetCode 每日一题笔记 日期:2026.05.06 题目:1861. 旋转盒子
LeetCode 每日一题笔记0. 前言日期2026.05.06题目1861. 旋转盒子难度中等标签数组、矩阵、双指针1. 题目理解问题描述给你一个m x n的字符矩阵boxGrid表示盒子的侧视图。矩阵元素含义#石头*固定障碍物.空位置将盒子顺时针旋转90度由于重力影响石头会垂直掉落直到碰到障碍物、其他石头或盒子底部。障碍物位置固定不变石头水平位置不会改变。初始状态保证石头都稳定在障碍物、其他石头或盒子底部上。返回旋转后的n x m矩阵。示例输入boxGrid [[#,.,#]]输出[[.], [#], [#]]解释原矩阵为一行三列顺时针旋转90度后变为三行一列。重力作用下两个石头掉落到底部形成从上到下.、#、#的结果。2. 解题思路核心观察问题可拆分为两步先完成矩阵的顺时针旋转90度再处理重力导致的石头掉落顺时针旋转90度后原矩阵的行变为新矩阵的列原矩阵的列变为新矩阵的逆序行重力作用下石头只会沿列向下移动因此可对每一列从下往上处理模拟石头掉落过程障碍物是天然的“分界点”石头无法穿过障碍物因此可分段处理每一列的不同区域。算法步骤矩阵旋转创建n x m的结果矩阵按顺时针90度旋转规则填充元素res[j][m-i-1] boxGrid[i][j]模拟重力掉落对结果矩阵的每一列从下往上遍历遇到空位时向上寻找最近的石头或障碍物找到石头则交换位置找到障碍物则停止当前区域的处理返回结果矩阵。3. 代码实现packagelc1861;classSolution{publicchar[][]rotateTheBox(char[][]boxGrid){intmboxGrid.length;intnboxGrid[0].length;char[][]resnewchar[n][m];for(inti0;im;i){for(intj0;jn;j){res[j][m-i-1]boxGrid[i][j];}}for(intin-1;i0;i--){for(intjm-1;j0;j--){if(res[i][j].){intki;while(k0){if(res[k][j]#){res[k][j].;res[i][j]#;break;}if(res[k][j]*){break;}k--;}}}}returnres;}}4. 代码优化说明优化点1双指针法模拟掉落消除嵌套循环对每一列用一个指针记录当前可放置石头的位置从下往上遍历遇到石头则直接放到可放置位置遇到障碍物则重置指针for(intcol0;colm;col){intwriten-1;for(intrown-1;row0;row--){if(res[row][col]*){writerow-1;}elseif(res[row][col]#){res[row][col].;res[write--][col]#;}}}优化点2旋转与掉落合并处理可选可在原矩阵上先模拟重力再旋转矩阵减少空间开销但逻辑复杂度会略有增加。5. 复杂度分析时间复杂度O(m×n)O(m \times n)O(m×n)矩阵旋转O(m×n)O(m \times n)O(m×n)模拟重力优化后双指针法为O(m×n)O(m \times n)O(m×n)原嵌套循环法最坏为O(m×n2)O(m \times n^2)O(m×n2)优化后可降为线性级。空间复杂度O(m×n)O(m \times n)O(m×n)需创建n x m的结果矩阵存储旋转后的盒子状态。6. 总结核心思路是矩阵旋转 重力模拟将问题拆分为两个独立步骤处理关键技巧利用双指针法优化石头掉落的模拟过程避免嵌套循环导致的高时间复杂度障碍物的存在天然分割了列分段处理每一列的石头掉落可进一步提升效率。关键点回顾顺时针旋转90度的矩阵变换规则res[j][m-i-1] boxGrid[i][j]重力作用下石头沿列向下掉落需按列处理双指针法是模拟掉落的最优方式可将时间复杂度优化至线性级。