1 题目描述
给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法。
拓展:
你的算法有使用额外的空间吗?
一种比较直接的算法是利用O(m,n)的空间,但是这不是一个好的解法
使用简单的改进可以在O(m+n)的空间解决这个问题,但是还不是最佳的解法
你能在常量级的空间复杂度内解决这个问题吗?
2 解题思路
见代码
3 代码实现
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
const int n_rows = matrix.size();
const int n_cols = matrix[0].size();
bool has_zer_in_row_zer = false;
bool has_zer_in_col_zer = false;
for(int j = 0; j < n_cols; j++)
if (matrix[0][j] == 0){
has_zer_in_row_zer = true;
break;
}
for(int i = 0; i < n_rows; i++)
if (matrix[i][0] == 0){
has_zer_in_col_zer = true;
break;
}
for(int i = 1; i < n_rows; i++)
for(int j = 1; j < n_cols; j++)
if (matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
for(int i = 1; i < n_rows; i++)
for(int j = 1; j < n_cols; j++)
if(matrix[i][0] == 0 ||
matrix[0][j] == 0)
matrix[i][j] = 0;
if (has_zer_in_row_zer)
for(int j = 0; j < n_cols; j++)
matrix[0][j] = 0;
if (has_zer_in_col_zer)
for(int i = 0; i < n_rows; i++)
matrix[i][0] = 0;
}
};
4 运行结果
运行时间:8ms
占用内存:748k