題目的要求很簡單,給定乙個二維方形矩陣,要求返回矩陣旋轉90度之後的結果。
下面我們來看兩個例子:
這個**一看就明白了,也就是說我們需要將乙個二維矩陣順時針旋轉90度。這個題意我們都很好理解,但是題目當中還有乙個限制條件:我們不能額外申請其他的陣列來輔助,也就是對我們的空間利用進行了限制。
如果沒有這個條件限制其實很容易,我們只需要算出每乙個座標旋轉之後的位置,我們重新建立乙個陣列然後依次填充就行了。
我們忽略矩陣當中具體的資料,而來看看矩陣旋轉前後的座標變化。這是矩陣旋轉之前的座標:
旋轉之後,座標變成了:
我們對照上面兩張圖觀察一下,可以看出對於座標(i, j)來說,它旋轉90度之後得到的結果應該是(j, n-1-i)。這裡的n是行數。
我們有了這個式子之後,我們可以繼續推廣。我們發現(i, j)位置的點旋轉之後到了(j, n-1-i)。而(j, n-1-i)位置的點旋轉之後到了(n-1-i, n-1-j),同理(n-1-i, n-1-j)旋轉之後到了(n-1-j, i),最後我們發現(n-1-j, i)旋轉之後回到了(i, j)。
也就是說對於一次旋轉來說,(i, j), (j,n-1-i), (n-1-i, n-1-j), (n-1-j, i)這四個位置的元素互相交換了位置,並沒有影響到其他位置。其實這個也是很容易想明白的,因為題目給定的是乙個方陣。
我們看下下圖就理解了:
也就是說我們只需要遍歷矩陣四分之一的部分,然後通過座標拿到互相交換的4個位置,然後交換它們的元素即可。
**真的很簡單,只有幾行:
class
solution:
defrotate
(self, matrix: list[list[int]]) -> none:
"""do not return anything, modify matrix in-place instead.
"""n = len(matrix)
# 注意一下範圍和下標即可
for i in range(n//2):
for j in range(i, n-1-i):
matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i] = \
matrix[n-1-j][i], matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j]
leetCode48 旋轉矩陣
目錄 一 題目描述 二 解題思路 三 實現 給定乙個 n n 的二維矩陣表示乙個影象。將影象順時針旋轉 90 度。說明 你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另乙個矩陣來旋轉影象。示例 1 給定 matrix 1,2,3 4,5,6 7,8,9 原地旋轉輸入矩陣,使其...
LeetCode刷題筆記 48
題目 旋轉影象。給定乙個 n n 的二維矩陣表示乙個影象。將影象順時針旋轉 90 度。說明 必須在原地旋轉影象,這意味著需要直接修改輸入的二維矩陣。請不要使用另乙個矩陣來旋轉影象。示例 1 給定 matrix 1,2,3 4,5,6 7,8,9 原地旋轉輸入矩陣,使其變為 7,4,1 8,5,2 9...
讓CentOS 4 8 支援NTFS格式行動硬碟
一直使用fat32格式的u盤複製資料,最近將新買的行動硬碟插到usb口上,居然 mount 不上去。網上搜尋一下,原來centos預設不支援ntfs格式,原因就不詳究了,解決的方法也很簡單,只需要編譯安裝兩個小軟體即可 1 fuse 2 ntf 3g 安裝 fuse configure make m...