LeetCode48、マトリックスを90度回転させる方法

この記事は個人のパブリックアカウントから作成されました:TechFlow、オリジナルは簡単ではありません、注意を求めてください


今日はLeetCodeの29日目です。簡単な行列回転の問題を見てみましょう。

タイトル

この問題の要件は非常に単純で、2次元の正方行列が与えられた場合行列を90度回転した後で結果を返す必要があります。

以下に2つの例を示します。

解決策

このアニメーションは一目でわかります。つまり、2次元マトリックスを時計回りに90度回転する必要があります。私たちは皆、この質問をよく理解していますが、質問には制限があります。スペースの利用を制限するために他のアレイを支援するために適用することはできません

そのような制限がない場合、それは実際には非常に簡単です。各座標回転の後に位置を計算するだけでよく、配列を再作成して順番に埋めます。

マトリックス内の特定のデータを無視し、マトリックスの回転前後の座標の変化を確認します。これは、行列の回転前の座標です。

回転後、座標は次のようになります。

上の2つの図を見ると、座標(i、j)の場合、90度回転した結果は(j、n-1-i)になるはずです。ここで、nは行数です。

この公式が完成したら、引き続き宣伝できます。(i、j)位置の点が回転後に(j、n-1-i)に到達することを発見しました。そして、(j、n-1-i)位置の点が(n-1-i、n-1-j)に回転され、同様に(n-1-i、n-1-j)が(n -1-j、i)、そして最後に(n-1-j、i)が回転後に(i、j)に戻ることがわかりました。

その一の回転、(i、j)のためのものである、( J、N-1-I)、(N-1-I、N-1-J)、(N-1-J、I) 4この位置の要素は、位置を相互に交換し、他の位置には影響しませんでした。実際、問題は正方行列で与えられるため、これも非常に理解しやすいです。

次の写真を見て理解します。

つまり、マトリックスの4分の1をトラバースし、座標を通じて交換される4つの位置を取得して、それらの要素を交換するだけです。

コード

コードはほんの数行です。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """

        n = len(matrix)
        
        # 注意一下范围和下标即可
        for i in range(n//2):
            for j in range(i, n-1-i):
                matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i] = \
                matrix[n-1-j][i], matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j]

今日の記事はそれだけです。もし何かやりがいを感じた場合は、フォローまたは再投稿しください。あなたの努力は私にとって非常に重要です。

117件の元の記事を公開 61のような 10,000以上の訪問

おすすめ

転載: blog.csdn.net/TechFlow/article/details/105475070