题目:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
链接: http://leetcode.com/problems/set-matrix-zeroes/
题解:
先判断矩阵第一行和第一列是否需要清零,然后再扫描矩阵把需要清零的行和列标注在第一行和第一列里, 最后进行清零操作。
Time Complexity - O(m x n), Space Complexity - O(1)。
public class Solution { public void setZeroes(int[][] matrix) { if(matrix == null || matrix[0].length == 0) return; int m = matrix.length, n = matrix[0].length; Boolean firstRowZero = false, firstColZero = false; for(int i = 0; i < m; i ++){ if(matrix[i][0] == 0){ firstColZero = true; break; } } for(int j = 0; j < n; j ++){ if(matrix[0][j] == 0){ firstRowZero = true; break; } } for(int i = 1; i < m; i ++){ for(int j = 1; j < n; j++){ if(matrix[i][j] == 0){ matrix[i][0] = 0; matrix[0][j] = 0; } } } for(int i = 1; i < m; i ++){ for(int j = 1; j < n; j ++){ if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0; } } if(firstRowZero == true) for(int j = 0; j < n; j ++) matrix[0][j] = 0; if(firstColZero == true) for(int i = 0; i < m; i ++) matrix[i][0] = 0; } }
Update:
public class Solution { public void setZeroes(int[][] matrix) { if(matrix == null || matrix.length == 0) return; boolean isZeroInFirstRow = false, isZeroInFirstCol = false; for(int i = 0; i < matrix.length; i++) if(matrix[i][0] == 0) { isZeroInFirstCol = true; break; } for(int j = 0; j < matrix[0].length; j++) if(matrix[0][j] == 0) { isZeroInFirstRow = true; break; } for(int i = 1; i < matrix.length; i++) { for(int j = 1; j < matrix[0].length; j++) { if(matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 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(isZeroInFirstCol) for(int i = 0; i < matrix.length; i++) matrix[i][0] = 0; if(isZeroInFirstRow) { for(int j = 0; j < matrix[0].length; j++) matrix[0][j] = 0; } } }
二刷:
题目不难但是打字比较费力。
Java:
Time Complexity - O(mn), Space Complexity - O(1)
public class Solution { public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0) { return; } boolean hasZeroFirstRow = false, hasZeroFirstCol = false; for (int i = 0; i < matrix.length; i++) { if (matrix[i][0] == 0) { hasZeroFirstCol = true; break; } } for (int j = 0; j < matrix[0].length; j++) { if (matrix[0][j] == 0) { hasZeroFirstRow = true; break; } } for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < matrix[0].length; j++) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 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 (hasZeroFirstRow) { for (int j = 0; j < matrix[0].length; j++) { matrix[0][j] = 0; } } if (hasZeroFirstCol) { for (int i = 0; i < matrix.length; i++) { matrix[i][0] = 0; } } } }
三刷:
Java:
public class Solution { public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0) return; boolean hasZeroFirstRow = false, hasZeroFirstCol = false; for (int i = 0; i < matrix.length; i++) { if (matrix[i][0] == 0) { hasZeroFirstCol = true; break; } } for (int j = 0; j < matrix[0].length; j++) { if (matrix[0][j] == 0) { hasZeroFirstRow = true; break; } } for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < matrix[0].length; j++) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 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 (hasZeroFirstRow) { for (int j = 0; j < matrix[0].length; j++) matrix[0][j] = 0; } if (hasZeroFirstCol) { for (int i = 0; i < matrix.length; i++) matrix[i][0] = 0; } } }
测试: