ETH官方钱包

前往
大廳
主題

LeetCode - 48. Rotate Image 解題心得

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

題目連結(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 度。




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

作者相關(guān)創(chuàng)作

更多創(chuàng)作