行列を読んで、時計回りのスパイラル

この質問の前にもブログに記事を書かれていますが、これは良い方法ではありません。https://blog.csdn.net/PMPWDF/article/details/80154608 

件名の説明:

m×nの要素のマトリックス(M行、n列)が与えられると、螺旋時計回りの順番に従って、行列のすべての要素を返します。

例:

 入力

 [ [1、2、3]、
 [4、5、6]、
 [7、8、9]
]
出力:[1,2,3,6,9,8,7,4,5] 

トピック分析:

問題を解決するための核となるアイデアは、ということである始点座標、方向、及び変位がユニークセグメント行列を定義することができるこれらのコイルエンドの端部に接続された複数のセグメントをアクセスするための抽象化処理をすることができ、;、電流経路内の全ての座標がことがわかっ行は、次の特性があります。

  • 始点座標は、実測値:複数のルートが端に接続端であるので、次のセグメントの開始が尾にセグメントです。
  • 見方向:常に右によるとは、上下のサイクルに、左。
  • 横変位行列幅、マトリックスの縦方向変位の高さを、常に現在のセグメントは、修正パラメータ行列の方向に応じて:変位が見つかりました。横0:高さ1、縦:幅-1
  • 全変位は、マトリックスの面積に等しいです。

達成するためのPythonコード: 

def spiralOrder(matrix):
    result = []
    height = len(matrix)
    if height == 0:
        width = 0
    else:
        width = len(matrix[0])
    size = height*width
    #顺时针方向x和y的变化
    dirX = [0,1,0,-1]
    dirY = [1,0,-1,0]

    #初始化起点坐标:(0,-1) 方向:向右
    x, y, dir = 0, -1, 0
    total = 0
    while total < size:
        if dir == 0 or dir ==2:
            #step是每次转折后要走几步
            step = width
            #当开始走一行时,矩阵的高要减一
            height -= 1
        else:
            step = height
            # 当开始走一列时,矩阵的宽要减一
            width -=1

        for i in range(step,0,-1):
            x += dirX[dir]
            y += dirY[dir]
            result.append(matrix[x][y])
        #取余,当dir>=4时,即已经至少转一圈了,保持right down left up
        dir = (dir+1)%4
        #每遍历完一行或一列加上遍历的元素个数
        total += step

    for i in range(len(result)):
        print(result[i])

if __name__ == "__main__":
    matrix = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    spiralOrder(matrix)




複雑性分析:

  • 時間計算量:O(N2)、Nは入力行列のすべての要素の数です。
  • 空間複雑:O(N)、結果セットの結果を格納します。

 

公開された52元の記事 ウォンの賞賛6 ビュー8997

おすすめ

転載: blog.csdn.net/PMPWDF/article/details/103057709