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],[0,3,1,0] ]進階:
- 一個直接的解決方案是使用 O(*m**n*) 的額外空間,但這并不是一個好的解決方案。
- 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
- 你能想出一個常數空間的解決方案嗎?
常規方法
思路
- 掃描整個矩陣,把為 0 的元素的坐標記錄下來,全部存為一個動態數組
- 對動態數組中的每一個坐標值,把對應的整行和整列置為 0
這樣處理的速度較慢,因為可能會出現重復處理的情況。
源代碼
public void setZeroes (int[][] matrix) {List<List<Integer>> flag = new ArrayList<List<Integer>>();for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {if (matrix[i][j] == 0) {flag.add(Arrays.asList(i,j));}}}for (List<Integer> integers : flag) {int row = integers.get(0);int col = integers.get(1);for (int i = 0; i < matrix.length; i++) {matrix[i][col] = 0;for (int j = 0; j < matrix[i].length; j++) {matrix[row][j] = 0;}}} }方法二:常數空間解決方案
思路也比較類似,找到一個為 0 的元素,記錄它的橫縱坐標,再把相應的行列置零。需要注意的是,當原始矩陣中的 0 元素在第一行或者第一列時,需要用兩個輔助變量記錄下來,特殊處理一下。
源代碼
public void setZeroes(int[][] matrix) {boolean fr = false,fc = false;for(int i = 0; i < matrix.length; i++) {for(int j = 0; j < matrix[0].length; j++) {if(matrix[i][j] == 0) {if(i == 0) fr = true;if(j == 0) fc = true;matrix[0][j] = 0;matrix[i][0] = 0;}}}for(int i = 1; i < matrix.length; i++) {for(int j = 1; j < matrix[0].length; j++) {if(matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}if(fr) {for(int j = 0; j < matrix[0].length; j++) {matrix[0][j] = 0;}}if(fc) {for(int i = 0; i < matrix.length; i++) {matrix[i][0] = 0;}} }轉載于:https://www.cnblogs.com/yuzhenzero/p/10197706.html
總結
- 上一篇: Eclipse 黑色主题
- 下一篇: 计算机网络知识点总结(第六版,谢希仁)