LeetCode48, 如何讓矩陣原地旋轉90度

2022-01-11 01:52:35 字數 1281 閱讀 5263

題目的要求很簡單,給定乙個二維方形矩陣,要求返回矩陣旋轉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...