題原文:面試
You are given an n x n 2D matrix representing an image.ide
Rotate the image by 90 degrees (clockwise).this
Follow up:
Could you do this in-place?spa
題意理解: 在只容許使用常數內存空間的前提下,順時針將nxn的矩陣轉置90度。code
一看題目,感受比較簡單,跟順時針打印矩陣相似,其實仍是有些不一樣的。此題比較有意思,作了兩遍,大概有三種思路來解決這個問題。blog
第一個思路就是使用額外的O(n*n)的內存空間,找出轉置先後矩陣中元素的對應關係,一一映射過去,而後再複製回來。這種思路能夠達到題意中的轉置要求,可是沒法作到 in-place要求,也就是原地轉置(個人理解是隻容許使用常數空間),故這方法不可取。內存
第二種思路是先按水平中線翻轉,再按左斜對角線翻轉,兩步一綜合恰好完成順時針旋轉90度的要求,空間須要也是符合題意的,實現起來也比較直觀。io
第三種思路是轉圈交換元素。這種思路須要較強的觀察能力,抓住一個要點:先觀察某一個元素在轉置先後,一塊兒了另外3個點的轉移(先把改點臨時存起來,它的位置會被A佔用,A的位置又會被B佔用,B的位置會被C佔用,這時C的位置空出來了,也就是觀察點在轉置後的位置)。再把這種狀況推廣到其餘點,不難發現,其餘點的轉置先後都有一個這個共同點。前兩種思路比較直觀,實現起來不容易搞混,第三種思路若不畫圖容易出現混淆。這裏就第三種方法寫兩段代碼,其實思路同樣,效果同樣,略有思惟直觀上的差別。event
1 public class Solution { 2 public void rotate(int[][] matrix) { 3 if(null == matrix || matrix.length == 0) 4 return ; 5 6 int size = matrix.length; 7 8 for(int i=0; i<size/2; i++) 9 for(int j=i; j<size-1-i; j++){ 10 int tmp = matrix[j][i]; 11 matrix[j][i] = matrix[size-1-i][j]; 12 matrix[size -1 -i][j] = matrix[size -1 -j][size - 1 -i]; 13 matrix[size - 1 - j][size -1 -i] = matrix[i][size - 1 -j]; 14 matrix[i][size -1 -j] = tmp; 15 } 16 } 17 }
1 public class Solution { 2 public void rotate(int[][] matrix) { 3 if(null == matrix || matrix.length == 0) 4 return ; 5 6 int size = matrix.length; 7 8 for(int i=0; i<size/2; i++) 9 for(int j=i; j<size-1-i; j++){ 10 tmp = matrix[i][j]; 11 matrix[i][j] = matrix[size - 1 -j][i]; 12 matrix[size - 1 -j][i] = matrix[size -1 -i][size -1 -j]; 13 matrix[size -1 - i] [size -1 -j] = matrix[j][size -1-i]; 14 matrix[j][size -1 -i] = tmp; 15 } 16 } 17 }
短小精悍的代碼老是讓面試官欣喜不已,值得回味。第三種思路是交換次數較少的。class