題目描述(中等難度)
給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 演算法。
進階:
- 一個直觀的解決方案是使用 O(mn) 的額外空間,但這並不是一個好的解決方案。
- 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
- 你能想出一個僅使用常量空間的解決方案嗎?
示例 1:
輸入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
輸出:[[1,0,1],[0,0,0],[1,0,1]]
示例2:
輸入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
輸出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
解題思路
重置零表示矩陣中如果有一個零,那麼將其同行同列都設為0,下圖第二行,第二列為零,使用紅色框標識元素都需要設定成零。
解法一 (空間複雜度 O(mn))
- 使用暴力破解,複製一個矩陣備份,遍歷複製矩陣,遇到零就把當前行和列重置零。
為何要使用複製矩陣呢?如果直接遍歷矩陣,如果第一行第一列為零,做了重置零以後,行全部都重置為零,遍歷後面的列全部都會設定成零。
解法二 (空間複雜度O(m+n))
- 優化一下解法一的演算法,如果一個行或者列是零,我們只需要標記一下該行或者該列為零即可。
- 使用兩個陣列記錄對應的行和列是否有零出現。
- 記錄結束之後,遍歷矩陣,如果記錄的行或者列有零,元素重置零。
解法三 (空間複雜度O(1))
- 在解法二的基礎上,把標記行或者列換成標記在矩陣上第一列和第一行。
- 遍歷第一行,如果為零,則同列全部置為零。
- 遍歷第一列,如果為零,則同行全部置為零。
- 因為遍歷列是在遍歷行之後,所以遍歷行的時候是不能遍歷第一列的。只能開始記錄一個標記位,標記第一行、第一列是否存在零。
總結
- 重置零分別使用了空間複雜度O(mn)、O(m+n)、O(1)。
- 矩陣存在零就把行和列都設定成零,就需要利用好第一行和第一列這屬性,存在零就在第一行和第一列設定零,對於特殊的首位置,需要新增標識。