前往
大廳
主題

LeetCode - 48. Rotate Image 解題心得

Not In My Back Yard | 2021-05-10 00:00:01 | 巴幣 0 | 人氣 269

題目連結:


題目意譯:
給定你一個 n × n 二維矩陣代表著一個圖片,將其旋轉 90 度(順時針)。

你必須原地(In-Place)旋轉圖片,即意味著你必須直接地更動輸入的二維陣列。請勿配置出另一個二維陣列然後做旋轉的動作。

限制:
matrix.length == n
matrix[i].length == n
1 ≦ n ≦ 20
-1000 ≦ matrix[i][j] ≦ 1000



範例測資:
範例 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]]

範例 3:
輸入: matrix = [[1]]
輸出: [[1]]

範例 4:
輸入: matrix = [[1,2],[3,4]]
輸出: [[3,1],[4,2]]


解題思維:
(以下所有索引值從 0 開始算)
我們可以將給定的矩陣從外到內分若干層。例如範例 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   
           
總層數會有 floor(n ÷ 2) 層。其中 floor() 為下高斯函數,對於正數來說等價於無條件捨去小數點。



而對於每一層,由於順時針旋轉 90 度的緣故,會有若干個四個四個一組的數字配對。例如範例 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
三個配對。而這樣子的配對數(如果我們現在是在第 i 層)會有 n - 2i - 1 個(令此值為 L)。

假設我們都是從每一層的左上角開始,而我們現在位於第 i 層。因此左上角的位置會是 matrix[i][i]

因為配對數有 L 個,所以我們會從 matrix[i][i] 跑到 matrix[i][i + L - 1] 為止,代表著每個配對的開頭。

對於每個配對 matrix[i][j]i ≦ j < i + L,我們可以計算出另外三個數字的位置:
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] 交換;
我們便將此配對順時針旋轉了 90 度。

將每一層、每一個配對都按照上述的作法旋轉完後,整個矩陣便順時針旋轉了 90 度。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作