73. Set Matrix Zeroes
题目要求是二维数组中出现0的地方所在行和所在列全变成0。
题目的关键是O(1)的时间复杂度,也就是在原地做。
思路:将第一行、第一列,除了(0,0)这个点的其他所有点用来记录这一行或者这一列是否出现0。
具体做法:先判断第一行第一列本身是否有0,用两个变量保存。然后遍历从(1,1)到(n-1,n-1)。一个位置出现了0,就把第一行的这一列和第一列的这一行的位置都置为0,用来表示这一行和这一列之后都需要被处理。然后遍历第一行和第一列,遇到0就将对应的一列或者一行置为0。最后再判断原始第一行第一列是否有0,如果有就把第一行或者第一列全置为0。
为什么第一行、第一列可以用来作为标记,因为只要这一行这一列出现了,那对应的第一行或者第一列那个位置本身也要被置为0,并且不管这一行或者这一列出现多少次,反正都是要被置为0。
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); if(m <= 0) return; int n = matrix[0].size(); if(n <= 0) return; bool flag_row = false,flag_col = false; for(int j = 0;j < n;j++){ if(matrix[0][j] == 0){ flag_row = true; break; } } for(int i = 0;i < m;i++){ if(matrix[i][0] == 0){ flag_col = 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++){ if(matrix[i][0] == 0){ for(int j = 1;j < n;j++) matrix[i][j] = 0; } } for(int j = 1;j < n;j++){ if(matrix[0][j] == 0){ for(int i = 1;i < m;i++) matrix[i][j] = 0; } } if(flag_row){ for(int j = 0;j < n;j++) matrix[0][j] = 0; } if(flag_col){ for(int i = 0;i < m;i++) matrix[i][0] = 0; } return; } };