1. 程式人生 > >旋轉影象(二維陣列的旋轉)——LeetCode陣列演算法題

旋轉影象(二維陣列的旋轉)——LeetCode陣列演算法題

給定一個 × 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為矩陣邊長,注意旋轉90ij的互換)

但題目要求必須在原地旋轉,那我們就只能通過遍歷來直接完成旋轉。

那給出的方法是:遍歷第一行的除了最後一個,然後吧最外面的一圈給旋轉完。如圖:

 

這樣就可以完成了,注意第二圈的第一個座標要變成[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;
			}
		}
    }