題目描述(中等難度)

給定一個 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)。
  • 矩陣存在零就把行和列都設定成零,就需要利用好第一行和第一列這屬性,存在零就在第一行和第一列設定零,對於特殊的首位置,需要新增標識。