🚀 力扣熱題 73:矩陣置零(詳解 + 多種解法)
📌 題目描述
給定一個
m x n
的整數矩陣matrix
,如果一個元素為 0,則將其所在行和列的所有元素都設為 0。請你 原地 使用常量空間解決。
🎯 示例
輸入:
matrix = [[1, 1, 1],[1, 0, 1],[1, 1, 1]
]
輸出:
[[1, 0, 1],[0, 0, 0],[1, 0, 1]
]
💡 解題思路一:額外標記數組
🔍 思路
- 創建兩個額外的數組
row[]
和col[]
分別標記哪些行和哪些列需要被置為 0; - 遍歷一遍矩陣,標記所有包含 0 的行和列;
- 再次遍歷矩陣,根據標記將對應的行和列設為 0。
? Go 實現
func setZeroes(matrix [][]int) {m, n := len(matrix), len(matrix[0])row := make([]bool, m)col := make([]bool, n)for i := 0; i < m; i++ {for j := 0; j < n; j++ {if matrix[i][j] == 0 {row[i] = truecol[j] = true}}}for i := 0; i < m; i++ {for j := 0; j < n; j++ {if row[i] || col[j] {matrix[i][j] = 0}}}
}
📊 復雜度分析
時間復雜度 | 空間復雜度 |
---|---|
O(m * n) | O(m + n) |
💡 解題思路二:使用矩陣第一行和第一列作為標記(原地操作)
🔍 思路
為了節省空間,我們可以利用矩陣的第一行和第一列來標記需要置 0 的行和列。
步驟如下:
- 用兩個變量記錄第一行和第一列是否需要置零;
- 使用剩下的矩陣作為標記區域;
- 倒序更新矩陣,防止污染標記。
? Go 實現
func setZeroes(matrix [][]int) {m, n := len(matrix), len(matrix[0])firstRowZero := falsefirstColZero := falsefor i := 0; i < m; i++ {if matrix[i][0] == 0 {firstColZero = true}}for j := 0; j < n; j++ {if matrix[0][j] == 0 {firstRowZero = true}}for i := 1; i < m; i++ {for j := 1; j < n; j++ {if matrix[i][j] == 0 {matrix[i][0] = 0matrix[0][j] = 0}}}for i := 1; i < m; i++ {for j := 1; j < n; j++ {if matrix[i][0] == 0 || matrix[0][j] == 0 {matrix[i][j] = 0}}}if firstRowZero {for j := 0; j < n; j++ {matrix[0][j] = 0}}if firstColZero {for i := 0; i < m; i++ {matrix[i][0] = 0}}
}
📊 復雜度分析
時間復雜度 | 空間復雜度 |
---|---|
O(m * n) | O(1) |
🧠 注意事項
- 原地操作 時要避免一開始就修改標記信息,順序非常關鍵;
- 可以從矩陣尾部開始遍歷,防止影響標記;
- 考察空間壓縮技巧,理解“用已有空間做標記”的思路。
? 總結
解法 | 是否原地操作 | 額外空間 | 思維難度 |
---|---|---|---|
標記數組 | ? 否 | O(m+n) | ???? |
原地標記 | ? 是 | O(1) | ???????? |
📌 推薦練習
- 🔁 289. 生命游戲(原地標記問題)
- 📦 54. 螺旋矩陣(二維數組遍歷)
- 🎯 面試經典題型,考察空間優化和矩陣操作能力
💡 如果覺得這篇文章對你有幫助,歡迎點贊 👍、收藏 ?、評論 💬、關注 💻!我會持續更新高質量 LeetCode 熱題解析。一起刷題,一起進步!🚀🎯