繼第 8 天的「19. Remove Nth Node From End of List」,今天來解 這題!還沒看過第 8 天或再之前天數的朋友,歡迎也去看看~
話不多說,我們開始吧!
給予一個 n x n 的二維陣列,請順時鐘旋轉 90 度。
請直接修改傳入的二維陣列,運算途中不得宣告新的二維陣列。
[[1,2,3], [[7,4,1],
[4,5,6], -> [8,5,2],
[7,8,9]] [9,6,3]]
在線性代數裡面,向右旋轉90度矩陣為
來自 轉置 和 水平反射 的相乘:
轉置矩陣為行列交換:
得
根據以上證明,在實作的時候就可以進行下列兩步驟
以這個為例
1 2
3 4
先進行轉置,轉置完後為:
1 3
2 4
也就是說
matrix[row][column]
和 matrix[column][row]
交換進行翻轉之後就會得到最後結果:
3 1
4 2
在這一個階段的運算會進行
接著就可以開始寫程式碼了:
class Solution {
func rotate(_ matrix: inout [[Int]]) {
let numberOfRows = matrix.count
// 轉置
for row in 0..<numberOfRows {
for column in row..<numberOfRows {
let temp = matrix[row][column]
matrix[row][column] = matrix[column][row]
matrix[column][row] = temp
}
}
// 水平反射
for row in 0..<numberOfRows {
for column in 0..<(numberOfRows/2) {
let newColumn = numberOfRows - 1 - column
let temp = matrix[row][column]
matrix[row][column] = matrix[row][newColumn]
matrix[row][newColumn] = temp
}
}
}
}
資料集為 n x n ,令 m 為 n x n 的總數。
Big O | 說明 | |
---|---|---|
時間複雜度 | O(m) | 線性走訪過 matrix |
空間複雜度 | O(1) | 只有宣告常數個變數 |
如果有什麼問題和回饋歡迎留言一起討論,
今天就到這裡,明天見!