繼第 9 天的「48. Rotate Image」,今天來解 73 這題!還沒看過第 9 天或再之前天數的朋友,歡迎也去看看~
話不多說,我們開始吧!
給予一個大小 m x n 的二維矩陣,當某個位置的元素為 0 時,所處的欄和列的所有元素都要設定為 0 。
看了以前自己的筆記,當時一開始的解就用了兩個 Set
s 來看哪些欄和列需要變換成 0 。就是 Follow up 裡的 O(m + n)
根據題目得知只要有 0 的位置,整列和整欄就必須換成 0
既然都要變成 0 了,那我們就可以把
作為 Hash Map 等同用途之用。
當第 0 欄和第 0 列有遇到 0 時,就必須要另外標記需要變更。
[0][0]
判斷是否需要把第 0 列全部換成 0[0][0]
被拿去當第 0 列用的標記說明和各區間的時間複雜度接註解在行內。
class Solution {
func setZeroes(_ matrix: inout [[Int]]) {
var shouldFirstColumnBecomeZero = false
// 1. 開始標記需要變成 0 的欄和列
//
// 時間複雜度: O(m)
for row in 0..<matrix.count {
// 當地 0 欄有出現 0
// 就標記需要變更
if matrix[row][0] == 0 {
shouldFirstColumnBecomeZero = true
}
// 第 0 欄已經在 `if matrix[row][0] == 0 {`
// 被檢查過了,因此欄的走訪從 1 開始
//
// 時間複雜度: O(n)
for column in 1..<matrix[0].count {
if matrix[row][column] == 0 {
matrix[row][0] = 0
matrix[0][column] = 0
}
}
}
// 2. 根據第 0 欄和第 0 列改 0
// 時間複雜度: O(m)
for row in 1..<matrix.count {
// 時間複雜度: O(n)
for column in 1..<matrix[0].count {
if matrix[row][0] == 0 || matrix[0][column] == 0 {
matrix[row][column] = 0
}
}
}
// 3. 第 0 列的處理
// 時間複雜度: O(m)
if matrix[0][0] == 0 {
for column in 1..<matrix[0].count {
matrix[0][column] = 0
}
}
// 4. 第 0 欄的處理
// 時間複雜度: O(n)
if shouldFirstColumnBecomeZero {
for row in 0..<matrix.count {
matrix[row][0] = 0
}
}
}
}
二維陣列或矩陣的大小為 m x n
Big O | 說明 | |
---|---|---|
時間複雜度 | O(mn) | 詳見下方 |
空間複雜度 | O(1) | 只有宣告常數個變數 |
合併後為
O(2mn + m + n)
因為 Big O 只考慮最高項,因此簡化為:
O(mn)
如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!