标签:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
思路:不能用额外空间,就用矩阵的第一行和第一列来标记这一行或这一列是否需要置0. 用两个bool量记录第一行和第一列是否需要置0
大神的代码和我的代码都是这个思路,但是我在画0的时候是行列分开处理的,大神的代码是一起处理的
void setZeroes(vector<vector<int> > &matrix) { if(matrix.empty()) return; bool iszero1 = false; //第一行是否全0 bool iszero2 = false; //第一列是否全0 //第一行 第一列单独拿出来做标记 for(int j = 0; j < matrix[0].size(); j++) { if(matrix[0][j] == 0) iszero1 = true; } for(int i = 0; i < matrix.size(); i++) { if(matrix[i][0] == 0) iszero2 = true; } for(int i = 1; i < matrix.size(); i++) { for(int j = 1; j < matrix[0].size(); j++) { //如果数值为0,把对应那一行的第一个 和 那一列的第一个数字置为0 if(matrix[i][j] == 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } //分行列处理 //先不考虑[0][0] 位置 如果某一行第一个为0,整行置0 for(int i = 1; i < matrix.size(); i++) { if(matrix[i][0] == 0) { for(int j = 1; j < matrix[0].size(); j++) { matrix[i][j] = 0; } } } for(int j = 1; j < matrix[0].size(); j++) { if(matrix[0][j] == 0) { for(int i = 1; i < matrix.size(); i++) { matrix[i][j] = 0; } } } if(iszero1) { for(int j = 0; j < matrix[0].size(); j++) { matrix[0][j] = 0; } } if(iszero2) { for(int i = 0; i < matrix.size(); i++) { matrix[i][0] = 0; } } return; }
大神的代码:
public void setZeroes(int[][] matrix) { int rownum = matrix.length; if (rownum == 0) return; int colnum = matrix[0].length; if (colnum == 0) return; boolean hasZeroFirstRow = false, hasZeroFirstColumn = false; // Does first row have zero? for (int j = 0; j < colnum; ++j) { if (matrix[0][j] == 0) { hasZeroFirstRow = true; break; } } // Does first column have zero? for (int i = 0; i < rownum; ++i) { if (matrix[i][0] == 0) { hasZeroFirstColumn = true; break; } } // find zeroes and store the info in first row and column 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; } } } // set zeroes except the first row and column 一起处理的 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; } } // set zeroes for first row and column if needed if (hasZeroFirstRow) { for (int j = 0; j < colnum; ++j) { matrix[0][j] = 0; } } if (hasZeroFirstColumn) { for (int i = 0; i < rownum; ++i) { matrix[i][0] = 0; } } }
【leetcode】Set Matrix Zeroes(middle)
标签:
原文地址:http://www.cnblogs.com/dplearning/p/4344825.html