Description
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
Analysis
题意是对任何含0元素的行或列整体置0。
本身是一道简单的题,Follow up中提到了很容易想到的两种思路:
- O(mn):存一份矩阵的副本,然后遍历该副本(因为题目中函数参数传递的是引用,所以直接该原矩阵比较方便),碰到0元素就将原矩阵中的对应行列全部置0。
- O(m+n):开一个bool数组,元素共m+n个,存储第m行(或第n列)是否含0,然后根据该数组对原矩阵置0。
但题目要求我们调整到常数的空间复杂度。实际上,O(m+n)的方法提示我们,我们只需要这m+n个bit就可以正确置0该矩阵,那么可以考虑直接将这些信息存入矩阵,为了方便我选取了第0行和第0列。那么思路如下:
- 先遍历第0行和第0列,确定其中是否含0,用布尔型变量
l0
和c0
记录; - 遍历矩阵剩余元素,若发现0,则在
(对应行,0)
和(0,对应列)
处用0记录; - 遍历第0行和第0列,若为0,则将对应行/列全部置0;
- 查看
l0
和c0
,若含0,则对应对第0行或第0列置0。
Code
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int c = matrix[0].size(), l = matrix.size(), i, j;
bool l0 = false, c0 = false;
for (i = 0; i < l; i++)
if (matrix[i][0] == 0){
l0 = true;
break;
}
for (j = 0; j < c; j++)
if (matrix[0][j] == 0){
c0 = true;
break;
}
for (i = 1; i < l; i++)
for (j = 1; j < c; j++){
if (matrix[i][j] == 0){
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
for (i = 1; i < l; i++)
if (matrix[i][0] == 0)
for (j = 1; j < c; j++)
matrix[i][j] = 0;
for (j = 1; j < c; j++)
if (matrix[0][j] == 0)
for (i = 1; i < l; i++)
matrix[i][j] = 0;
if (l0){
for (i = 0; i < l; i++)
matrix[i][0] = 0;
}
if (c0){
for (j = 0; j < c; j++)
matrix[0][j] = 0;
}
}
};
Appendix
- Link: https://leetcode.com/problems/set-matrix-zeroes/
- Run Time: 53ms