51.螺旋行列(Python)

1202 ワード

もっと素晴らしい内容は、「力ボタン中等問題」に注目してください.
タイトル
難易度:★★★☆タイプ:行列、2次元配列方法:法則を探す
m x n個の要素を含むマトリクス(m行、n列)を指定します.マトリクス内のすべての要素を時計回りの螺旋順に返します.

例1入力:[[1,2,3],[4,5,6],[7,8,9]]出力:[1,2,3,6,9,8,7,4,5]
例2入力:[[1,2,3,4],[5,6,7,8],[9,10,11,12]]出力:[1,2,3,4,8,12,11,10,9,5,6,7]
に答える
スパイラル遍歴行列のためには、いくつかの重要な問題を解決する必要があります.
  • 直線の方向をどのように決定しますか?どうやって?
  • 直線移動の境界をどのように決定しますか?

  • この2つの問題は,一歩進むたびに方向ずれ量di,djをそれぞれ0,1とし,初期には右方向に遍歴を開始し,遍歴後の位置を空にし,転向する必要があるか否かを判断することで,前方がマトリクス境界または空であるか否かを判断することで実現できる.右折転向操作はdi,dj=dj,−diであり,その後遍歴を継続すればよい.
    class Solution:
        def spiralOrder(self, matrix):
            """
            :param matrix: List[List[int]]
            :return: List[int]
            """
    
            res, i, j, di, dj = [], 0, 0, 0, 1
            if matrix:
                for _ in range(len(matrix) * len(matrix[0])):
                    res.append(matrix[i][j])
                    matrix[i][j] = None
                    next_step = matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])]
                    if next_step is None:
                        di, dj = dj, -di
                    i += di
                    j += dj
            return res
    

    質問やアドバイスがあれば、コメントエリアへようこそ~