【Leetcode】【Medium】Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
解题思路:
题目乍一看很简单,将矩阵当前为0的位的行列都置为0;
问题在于:当遇到一个已知0时,不能立刻将其行列置0,因为这样会把原本不是0的位更改,导致继续遍历的时候无法区分哪些是初始0,哪些是后改0;
有一个解决方法,就是先遍历所有位,记录所有初始为0的行列坐标,遍历一遍之后,再统一做更改;
但是这个解决方法会占用额外的空间,如何使用o(1)空间完成置0的任务?
解决方法:
1、先找到一个初始0位置,并记录它的行oi和列oj;
2、oi行和oj列最终需要置零,索性将oi这一行和oj这一列当做记录数组;
3、遍历所有位置,如果遇到0,则将其i和j对应的(oi, j)和(i, oj)置0,这样不会多置0,也做到了标记的作用;
4、最终遍历oi这一行,将值为0的位置所在列置0;同理遍历oj这一列的元素,将其值为0的位置所在行置0;
代码:
1 class Solution { 2 public: 3 void setZeroes(vector<vector<int>>& matrix) { 4 int m = matrix.size(); 5 if (m == 0) 6 return; 7 int n = matrix[0].size(); 8 int oi = -1, oj = -1; 9 for (int i = 0; i < m; ++i) { 10 for (int j = 0; j < n; ++j) { 11 if (matrix[i][j] == 0) { 12 oi = i; 13 oj = j; 14 break; 15 } 16 } 17 if (oi != -1) break; 18 } 19 if (oi == -1) return; 20 21 for (int i = 0; i < m; ++i) { 22 for (int j = 0; j < n; ++j) { 23 if (matrix[i][j] == 0) { 24 matrix[oi][j] = 0; 25 matrix[i][oj] = 0; 26 } 27 } 28 } 29 30 for (int i = 0; i < m; ++i) { 31 if (i != oi && matrix[i][oj] == 0) { // notice 32 for (int j = 0; j < n; ++j) 33 matrix[i][j] = 0; 34 } 35 } 36 37 for (int j = 0; j < n; ++j) { 38 if (matrix[oi][j] == 0) { 39 for (int i = 0; i < m; ++i) 40 matrix[i][j] = 0; 41 } 42 } 43 44 for (int j = 0; j < n; ++j) 45 matrix[oi][j] = 0; 46 47 return; 48 } 49 };