python(leetcode)-48旋轉圖像

給定一個 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()操做
相關文章
相關標籤/搜索