給定一個 n × n 的二維矩陣表示一個圖像。 將圖像順時針旋轉 90 度。 說明: 你必須在原地旋轉圖像,這意味着你須要直接修改輸入的二維矩陣。請不要使用另外一個矩陣來旋轉圖像。 示例 1: 給定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉輸入矩陣,使其變爲: [ [7,4,1], [8,5,2], [9,6,3] ]
這道題其實不難懂,有線性代數基礎的人都知道轉置矩陣,雖然這題與轉置不一樣可是題目意思類似。90度順時針旋轉矩陣。而且要求不能新建矩陣存儲即在原矩陣上操做。html
雖然題目不難懂,可是作起來很是麻煩,筆者想了好久才作出這題,主要是邏輯上的思路必定要清晰。python
先上代碼(經過-44ms)擊敗99%函數
1 class Solution: 2 def rotate(self, matrix): 3 """ 4 :type matrix: List[List[int]] 5 :rtype: void Do not return anything, modify matrix in-place instead. 6 """ 7 lens=len(matrix[0]) 8 for i in range(lens//2): #對第i行進行換位操做 9 for j in range(i,lens-1-i): #對第j列進行換位操做 10 temp=matrix[i][j] #temp=a 11 matrix[i][j]=matrix[lens-1-j][i] #a=b 12 matrix[lens - 1 - j][i]=matrix[lens-1-i][lens-1-j] #b=c 13 matrix[lens - 1 - i][lens - 1 - j]=matrix[j][lens-1-i] #c=temp 14 matrix[j][lens - 1 - i]=temp 15 16 if __name__=="__main__": 17 s=Solution() 18 matrix = [[1,2], 19 [3,4]] 20 print(s.rotate(matrix))
上一個簡單的思惟導圖spa
就是作一個旋轉的操做 這裏的難點有2個地方。debug
1.a-->b-->c-->d-->temp的對應的下標不能錯code
2.兩層循環中,第二層循環是從i開始到lens-1-i(倒數第i+1個)htm
而後遇到錯誤debug看看是否和本身的邏輯同樣運行,中途debug了好屢次 才理順 - -!blog
再看一個評論區大佬的代碼(經過44ms)擊敗99%ip
1 class Solution: 2 def rotate(self, matrix): 3 """ 4 :type matrix: List[List[int]] 5 :rtype: void Do not return anything, modify matrix in-place instead. 6 """ 7 matrix[:] = zip(*matrix[::-1]) 8 9 if __name__=="__main__": 10 s=Solution() 11 matrix = [[1,2], 12 [3,4]] 13 print(s.rotate(matrix))
真的nb,完美詮釋了python的魅力,一行代碼解決問題io
解釋一下
首先解釋matrix[::-1] 在list中存在3個參數[a,b,c], a爲起始 b爲終點 c爲步長
當c<0時 表明倒序,從後往前。而且a和b缺省時,則 [::-1]=[-1,-len()-1,-1] 等於倒敘排列一遍
而後解釋zip()函數 zip意爲解壓 相似於縱向合併 舉個例子就明白了
1 a=[1,2,3] 2 b=[4,5,6] 3 ziped =zip(a,b) #[(1, 4), (2, 5), (3, 6)] 4 c=[[1,2,3],[4,5,6]] 5 ziped2=zip(c) #[(1, 4), (2, 5), (3, 6)]
通過這兩部操做,確實能夠實現90度旋轉
[[1,2,3], [4,5,6], [7,8,9]] [[7,8,9] [4,5,6], [1,2,3]] #[::-1]操做 [[7,4,1], [8,5,2], [9,6,3]] # zip()操做