Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Solution
At first, I came up with a solution: using the first column and first row to store the information about a row or column should be zero. However, the code is very ugly (See Appendix A). Later, I improved the code by use only the row that we first met an zero to store information about whether the column should be zero. Below is the clean code.
- public class Solution {
- public void setZeroes(int[][] matrix) {
- int m = -1;
- for(int i = 0; i<matrix.length; i++){
- boolean foundZero = false;
- for(int j=0; j<matrix[i].length; j++){
- if(matrix[i][j] == 0){
- foundZero = true;
- break;
- }
- }
- if(foundZero && m==-1){
- m = i;
- continue;
- }
- if(foundZero){
- for(int j =0;j<matrix[i].length; j++){
- if(matrix[i][j] == 0) matrix[m][j] = 0;
- matrix[i][j] = 0;
- }
- }
- }
- if(m!= -1){
- for(int j = 0; j<matrix[m].length; j++){
- if(matrix[m][j] == 0)
- for(int i =0; i<matrix.length; i++)
- matrix[i][j] = 0;
- matrix[m][j] = 0;
- }
- }
- }
- }
Appendix A: How ugly it was
- public class Solution {
- public void setZeroes(int[][] matrix) {
- boolean firstRowZero = false;
- boolean firstColZero = false;
- for(int i =0; i<matrix.length; i++)
- if(matrix[i][0] == 0) {
- firstColZero = true;
- break;
- }
- for(int i =0; i<matrix[0].length; i++)
- if(matrix[0][i] == 0) {
- firstRowZero = 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++){
- if(matrix[i][0] == 0)
- for(int j=1; j<matrix[0].length; j++){
- matrix[i][j] = 0;
- }
- }
- for(int i=1; i<matrix[0].length; i++){
- if(matrix[0][i] == 0)
- for(int j=1; j<matrix.length; j++){
- matrix[j][i] = 0;
- }
- }
- if (firstRowZero)
- for(int i =0; i<matrix[0].length; i++)
- matrix[0][i] = 0;
- if (firstColZero)
- for(int i=0; i<matrix.length; i++)
- matrix[i][0] = 0;
- }
- }
- class Solution(object):
- def setZeroes(self, matrix):
- """
- :type matrix: List[List[int]]
- :rtype: void Do not return anything, modify matrix in-place instead.
- """
- m = -1
- for i in range(len(matrix)):
- found = False
- for j in range(len(matrix[0])):
- if matrix[i][j] == 0:
- found = True
- break
- if found and m==-1:
- m = i
- continue
- if found:
- for j in range(len(matrix[i])):
- if matrix[i][j] == 0:
- matrix[m][j] = 0
- matrix[i][j] = 0
- if m!=-1:
- for j in range(len(matrix[m])):
- if matrix[m][j] == 0:
- for i in range(0, len(matrix)):
- matrix[i][j] = 0
- matrix[m][j] = 0
No comments:
Post a Comment