1861。旋转盒子
难度:中等
主题:数组、两个指针、矩阵
给你一个 m x n 的字符框矩阵,代表盒子的侧视图。盒子的每个单元格都是以下之一:
盒子顺时针旋转90度,导致一些石头因重力而掉落。每块石头都会落下,直到落在障碍物、另一块石头或盒子的底部。重力不会影响障碍物的位置,盒子旋转产生的惯性不会影响石头的水平位置。
保证盒子中的每块石头都放置在障碍物、另一块石头或盒子的底部上。
返回一个 n x m 矩阵,表示上述旋转后的盒子。
示例1:
示例2:
示例 3:
约束:
提示:
解决方案:
我们需要遵循几个不同的步骤:
旋转盒子:我们首先将矩阵顺时针旋转90度。旋转后的矩阵将有 n 行和 m 列,其中 n 是原始框中的列数,m 是行数。
重力效果:旋转后,我们需要模拟重力的效果。这意味着所有石头 ('#') 都应该“落到”新列的底部,只有在遇到障碍物 ('*') 或另一块石头 ('#') 时才停止。
旋转:旋转后,原矩阵中第[i][j]位置的元素将被放置到旋转后的第[j][m-1-i]位置矩阵。
重力模拟:我们需要从下到上处理每一列。如果有一块石头('#'),它就会掉下来,直到到达障碍物或底部。如果单元格为空(“.”),则可以容纳一块石头。
让我们用 PHP 实现这个解决方案:1861。旋转盒子
<?php function rotateTheBox($box) { ... ... ... /** * go to ./solution.php */ } // Example Usage $box = [ ["#", ".", "#"], ]; print_r(rotateTheBox($box)); $box = [ ["#", ".", "*", "."], ["#", "#", "*", "."], ]; print_r(rotateTheBox($box)); $box = [ ["#", "#", "*", ".", "*", "."], ["#", "#", "#", "*", ".", "."], ["#", "#", "#", ".", "#", "."], ]; print_r(rotateTheBox($box)); ?>
模拟重力:
旋转矩阵:
$box = [ ["#", ".", "#"], ];
[ [".",], ["#",], ["#",], ]
$box = [ ["#", ".", "*", "."], ["#", "#", "*", "."], ];
[ ["#", "."], ["#", "#"], ["*", "*"], [".", "."], ]
总计:O(m x n)。
这个解决方案是高效的并且遵守问题的约束。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
以上是旋转盒子的详细内容。更多信息请关注PHP中文网其他相关文章!