這題如果用HashSet的O(m+n) Space來做的話学辱,應(yīng)該是個(gè)easy題的難度,我用兩分鐘寫了下褂痰。答案中有人用了一種O(1) Space的方法直晨,也在下面貼一下搀军。
O(m + n) SPACE
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return;
Set<Integer> row = new HashSet<>();
Set<Integer> col = new HashSet<>();
for (int i = 0; i < matrix.length; i++)
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
row.add(i);
col.add(j);
}
}
for (int r : row) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[r][j] = 0;
}
}
for (int c : col) {
for (int j = 0; j < matrix.length; j++) {
matrix[j][c] = 0;
}
}
O(1) SPACE
這個(gè)方法的思路是,把每個(gè)0的字母所在的行和列映射到第一行和第一列上勇皇。它跳過了第一列罩句,因?yàn)樾枰玫谝涣械闹祦碜鲇成洹H绻惶^敛摘,那你把第一列的0也映射到第一行的頂端了门烂,第一行就沒法根據(jù)col來判斷是否需要set 0,比如
111
012
這樣的case就會(huì)變成全0的矩陣兄淫。
其實(shí)也可以把row也留出來但是沒必要诅福。沒用row,這也是為什么從row-1開始遍歷拖叙。但是最后的for (int j = cols - 1; j >= 1; j--)是可以改成從0開始的。
void setZeroes(vector<vector<int> > &matrix) {
int col0 = 1, rows = matrix.size(), cols = matrix[0].size();
for (int i = 0; i < rows; i++) {
if (matrix[i][0] == 0) col0 = 0;
for (int j = 1; j < cols; j++)
if (matrix[i][j] == 0)
matrix[i][0] = matrix[0][j] = 0;
}
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 1; j--)
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if (col0 == 0) matrix[i][0] = 0;
}
}