旋轉影象(二維陣列的旋轉)——LeetCode陣列演算法題
阿新 • • 發佈:2018-12-31
給定一個 n × n 的二維矩陣表示一個影象。
將影象順時針旋轉 90 度。
說明:
你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影象。
示例 1:
給定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉輸入矩陣,使其變為: [ [7,4,1], [8,5,2], [9,6,3] ]
示例 2:
給定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋轉輸入矩陣,使其變為: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11]
]
解題思路:對於這個題目,我們可以採取:建立一個新的二維陣列,通過遍歷第一個陣列,
把每個數字旋轉90度後應該到達的位置放進第二個陣列就可以。
也就是:arr2[j][n - i] = arr1[i][j] ; (n為矩陣邊長,注意旋轉90度i和j的互換)
但題目要求必須在原地旋轉,那我們就只能通過遍歷來直接完成旋轉。
那給出的方法是:遍歷第一行的除了最後一個,然後吧最外面的一圈給旋轉完。如圖:
這樣就可以完成了,注意第二圈的第一個座標要變成[i][j(j=i)]。
具體程式碼如下:
public void rotate(int[][] matrix) { int n = matrix.length; for(int i = 0; i < n/2 ; i++) { for (int j = i; j < n - i - 1; j++) { int tmp = matrix[i][j]; matrix[i][j] = matrix[n-1-j][i]; matrix[n-1-j][i] = matrix[n-1-i][n-1-j]; matrix[n-1-i][n-1-j] = matrix[j][n-1-i]; matrix[j][n-1-i] = tmp; } } }