題目連結(jié):
題目意譯:
給定你一個 n × n 二維矩陣代表著一個圖片,將其旋轉(zhuǎn) 90 度(順時針)。
你必須原地(In-Place)旋轉(zhuǎn)圖片,即意味著你必須直接地更動輸入的二維陣列。請勿配置出另一個二維陣列然後做旋轉(zhuǎn)的動作。
限制:
matrix.length == n
matrix[i].length == n
1 ≦ n ≦ 20
-1000 ≦ matrix[i][j] ≦ 1000
範(fàn)例測資:
範(fàn)例 1:
輸入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出: [[7,4,1],[8,5,2],[9,6,3]]
範(fàn)例 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]]
範(fàn)例 3:
輸入: matrix = [[1]]
輸出: [[1]]
範(fàn)例 4:
輸入: matrix = [[1,2],[3,4]]
輸出: [[3,1],[4,2]]
解題思維:
(以下所有索引值從 0 開始算)
我們可以將給定的矩陣從外到內(nèi)分若干層。例如範(fàn)例 2 的矩陣
5 1 9 11
2 4 8 10
13 3 6 7
15 14 12 16
第 0 層為
5 1 9 11
2 10
13 7
15 14 12 16
第 1 層為
4 8
3 6
總層數(shù)會有 floor(n ÷ 2) 層。其中 floor() 為下高斯函數(shù),對於正數(shù)來說等價於無條件捨去小數(shù)點。
而對於每一層,由於順時針旋轉(zhuǎn) 90 度的緣故,會有若干個四個四個一組的數(shù)字配對。例如範(fàn)例 2 的第 0 層有
5 1 9 11
2 10
13 7
15 14 12 16
、
5 1 9 11
2 10
13 7
15 14 12 16
、
5 1 9 11
2 10
13 7
15 14 12 16
三個配對。而這樣子的配對數(shù)(如果我們現(xiàn)在是在第 i 層)會有 n - 2i - 1 個(令此值為 L)。
假設(shè)我們都是從每一層的左上角開始,而我們現(xiàn)在位於第 i 層。因此左上角的位置會是 matrix[i][i]。
因為配對數(shù)有 L 個,所以我們會從 matrix[i][i] 跑到 matrix[i][i + L - 1] 為止,代表著每個配對的開頭。
對於每個配對 matrix[i][j](i ≦ j < i + L),我們可以計算出另外三個數(shù)字的位置:
matrix[j][i + L]
matrix[i + L][2i - j + L]
matrix[2i - j + L][i]
接著,我們作以下操作:
將 matrix[i][j] 和 matrix[j][i + L] 交換;
將 matrix[i][j] 和 matrix[i + L][2i - j + L] 交換;
將 matrix[i][j] 和 matrix[2i - j + L][i] 交換;
我們便將此配對順時針旋轉(zhuǎn)了 90 度。
將每一層、每一個配對都按照上述的作法旋轉(zhuǎn)完後,整個矩陣便順時針旋轉(zhuǎn)了 90 度。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。