天天看點

數組與矩陣---之字型列印矩陣

【題目】

  給定一個矩陣 matrix,按照“之”字形的方式列印這個矩陣,例如:

  1  2  3  4

  4  5  6  8

  9  10  11  12

  “之”字形列印的結果為:1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12

  要求額外空間複雜度為O(1)

【基本思路】

  1. 上坐标(tR1,tC1)初始化為(0,0),先沿着矩陣第一行移動(tC1++),當到達第一行最右邊的元素後,再沿着矩陣最後一列移動(tR1++).
  2. 下坐标(tR2,tC2)初始化為(0,0),先沿着矩陣第一列移動(tR2++),當到達第一列最下邊的元素後,再沿着矩陣最後一行移動(tC2++).
  3. 上坐标和下坐标同時移動,每次移動後,上坐标和下坐标的連線就是矩陣的一條斜線,列印斜線上的元素即可.
  4. 用一個boolean型變量flag控制列印的方向.

下面是使用python3.5實作的代碼。

def printMatrixZigZag(m):
    def printLevel(m, tR1, tC1, tR2, tC2, flag):
        if flag:
            while tR2 != tR1 - :
                print(m[tR2][tC2], end=' ')
                tR2 -= 
                tC2 += 
        else:
            while tR1 != tR2 + :
                print(m[tR1][tC1], end=' ')
                tR1 += 
                tC1 -= 


    tR1 = tC1 = tR2 = tC2 = 
    dR = len(m) - 
    dC = len(m[]) - 
    flag = True
    while tR1 <= dR and tC2 <= dC:
        printLevel(m, tR1, tC1, tR2, tC2, flag)
        tR1 = tR1 if tC1 != dC else tR1 + 
        tC1 = tC1 +  if tC1 != dC else tC1
        tC2 = tC2 if tR2 != dR else tC2 + 
        tR2 = tR2 +  if tR2 != dR else tR2
        flag = not flag