旋轉影象 【LeetCode 陣列】
阿新 • • 發佈:2019-01-29
給定一個 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] ]
題解:首先以從對角線為軸翻轉,然後再以x軸中線上下翻轉即可得到結果,如下圖所示(其中藍色數字表示翻轉軸):
1 2 3 9 6 3 7 4 1
4 5 6 --> 8 5 2 --> 8 5 2
7 8 9 7 4 1 9 6 3
class Solution { public void rotate(int[][] matrix) { int row=matrix[0].length; //方法二,先按對角線進行交換,然後按豎直線交換 for (int i = 0; i < matrix.length; i++) { for (int j = i+1; j < row; j++) { //按對角線交換 int t=matrix[i][j]; matrix[i][j]=matrix[j][i]; matrix[j][i]=t; } for (int j = 0; j < row/2; j++) { //然後按豎直線交換 int t=matrix[i][j]; matrix[i][j]=matrix[i][row-1-j]; matrix[i][row-1-j]=t; } } } }
方法二:
使用輔助陣列,交換規則位:(0,0)->(0,2), (1,0)->(0,1),
(0,1)->(1,2), (1,1)->(1,1),
(0,2)->(2,2), (1,2)->(2,1),
所以對於a[j][col-1-i],對應為為matrix[i][j]
//旋轉影象 public static void rotate(int[][] matrix) { int row=matrix[0].length; int col=matrix.length; int [][]a=new int[col][row]; for (int i = 0; i < col; i++) { for (int j = 0; j < row; j++) { a[j][col-1-i]=matrix[i][j]; } } for (int i = 0; i < col; i++) { for (int j = 0; j < row; j++) { matrix[i][j]=a[i][j]; } } }