給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。
想法第二種方法不高效的地方在於我們會重複對同一行或者一列賦零。我們可以推遲對行和列賦零的操作。
我們可以用每行和每列的第乙個元素作為標記,這個標記用來表示這一行或者這一列是否需要賦零。這意味著對於每個節點不需要訪問 m+nm+n 個格仔而是只需要對標記點的兩個格仔賦值。
if cell[i][j] == 0
這些標籤用於之後對矩陣的更新,如果某行的第乙個元素為零就將整行置零,如果某列的第乙個元素為零就將整列置零。
演算法遍歷整個矩陣,如果 cell[i][j] == 0 就將第 i 行和第 j 列的第乙個元素標記。
第一行和第一列的標記是相同的,都是 cell[0][0],所以需要乙個額外的變數告知第一列是否被標記,同時用 cell[0][0] 繼續表示第一行的標記。
然後,從第二行第二列的元素開始遍歷,如果第 r 行或者第 c 列被標記了,那麼就將 cell[r][c] 設為 0。這裡第一行和第一列的作用就相當於方法一中的 row_set 和 column_set 。
然後我們檢查是否 cell[0][0] == 0 ,如果是則賦值第一行的元素為零。
然後檢查第一列是否被標記,如果是則賦值第一列的元素為零。
class solution
for(
int i =
0; i < n; i++
)for
(int i =
1; i < m; i++)}
}for
(int i =
1; i < n; i++
)for
(int i =
0; i < m; i++)if
(flag ==0)
for(
int j =
0; j < m; j++
) matrix[j][0
]=0;
}};
寫的很醜,盡力了。
第二種方法不高效的地方在於我們會重複對同一行或者一列賦零。我們可以推遲對行和列賦零的操作。
我們可以用每行和每列的第乙個元素作為標記,這個標記用來表示這一行或者這一列是否需要賦零。
推遲修改,進行標記,通過新增額外的資訊來解決問題。
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...
leetcode73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 空間複雜度為o mn 的解法自不用多說,直接新建乙個和matrix等大小的矩陣,然後一行一行的掃,只...
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...