思路:
直觀的思路:遍歷矩陣,記錄下每乙個0元素所在的行與列,然後再次遍歷矩陣,若此時遍歷到的位置的行或列**現過0元素,則需要將此位置置為0。這是兩次遍歷,不可以合併為一次遍歷。
空間複雜度為:o(m + n)
使用兩個hashset,分別儲存當前位置的數為0時的行號與列號
public void setzeroes(int matrix)
// 存放元素為0的行號
hashsetrows = new hashset<>();
// 存放元素為0的列號
hashsetcols = new hashset<>();
for (int i = 0; i < matrix.length; i++) }}
for (int i = 0; i < matrix.length; i++) }}
}
原地解決此問題
即空間複雜度為o(1),思路如下:
利用原矩陣的第一行與第一列記錄元素0所在的行與列
若當前位置的元素為0,則將它所在行的第乙個元素與所在列的第乙個元素都置為0,代表此行此列出現過0元素,需要將此行此列所有元素都置為0
由於第一行與第一列都用於記錄此行此列是否存在元素0,對第一行與第一列元素有所破壞,所以需要對第一行與第一列的元素進行單獨標記,單獨處理
使用兩個布林型別的變數來記錄第一行與第一列中是否出現過0元素。使用row0 來標記第一行中是否出現了0元素,使用col0來標記第一列中是否出現了0元素
**參考自:
public void setzeroes(int matrix)
// 由於第一行與第一列都用於記錄此行此列是否存在元素0,對第一行與第一列元素有所破壞
// 所以需要對第一行與第一列的元素進行單獨標記
// 使用row0 來標記第一行中是否出現了0元素,使用col0來標記第一列中是否出現了0元素
boolean row0 = false, col0 = false;
for (int i = 0; i < matrix.length; i++)
// 當前位置為第一列
if (j == 0)
// 此行此列的乙個元素均置為0
matrix[i][0] = matrix[0][j] = 0;}}
}// 從1,1位置開始遍歷
// 這是因為第一行與第一列是用來記錄此行此列是否有元素0,需要進行處理
for (int i = 1; i < matrix.length; i++) }}
// 若第一行中本身含有0元素,則將第一行中所有元素置為0
if (row0)
}// 若第一列中本身含有0元素,則將第一列中所有元素置為0
if (col0)
}}
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...