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中文網其他相關文章!