一. 数组_二维数组变换_73. 矩阵置零( 二 )

< m; i++) {for(int j = 1; j < n; j++) {if(!matrix[i][j]) {matrix[i][0] = matrix[0][j] = 0;}}}//根据第一行和第一列的值更新剩下的元素for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(!matrix[i][0] || !matrix[0][j]) {matrix[i][j] = 0;}}}//根据第一行和第一列的标志变量更新第一行和第一列的值if(f_row) {for(int i = 0; i < n; i++) {matrix[0][i] = 0;}}if(f_column) {for(int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
只是用一个标记变量标识
1.首先检查第一列是否有0,有的话,标识
2.检查第一行是否有0,有的话[0][0]=0,这个有先后关系,必须先检查列,再检查行
3.和上面一样,利用当前值更新第一行和第一列,利用第一行和第一列更新当前值
4.首先检查[0][0]更新第一行,之后在更新第一列,这个也有顺序 。
这里[0][0]标记行和标记列都是可以的,唯一的不同是,这里标记行,行就要后记录,先处理,标记列,列就要被优先处理
否则会被影响 。
void setZeroes(vector>& matrix) {int m = matrix.size();int n = matrix[0].size();bool f_column = false;//第一列是否有0检查for(int i = 0; i < m; i++) {if(!matrix[i][0]) {f_column = true;break;}}//第一行是否有0检查for(int i = 0; i < n; i++) {if(!matrix[0][i]) {matrix[0][0] = 0;}}//遍历除了第一行和第一列之外的所有行,标记for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(!matrix[i][j]) {matrix[i][0] = matrix[0][j] = 0;}}}//根据第一行和第一列的标识,更新其他元素for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(!matrix[i][0] || !matrix[0][j]) {matrix[i][j] = 0;}}}//更新第一行//这里若是第一行的第二个元素到最后一个元素有0,那么会让其赋值为0//或者本身这个位置就是0if(!matrix[0][0]) {for(int i = 0; i < n; i++) {matrix[0][i] = 0;}}if(f_column) {for(int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
这里官方的题解,可以拆成上面的样子,但是官方的题解要考虑的内容很多,而且编程技巧很足
多个for循环,组合成一个for循环 。
检查可以分为首先进行第一列检查,之后,在进行第一行检查完成之后,在进行剩下行的检查,虽然写在一个for循环里面,但是又先后顺序
在置位0的时候也是有顺序的,先从最后一行开始置位0,先根据第一行和第一列更新内部,之后,倒着更新,当更新到第一行的时候,根据[0][0]的位置更新
对于第一列,根据更新