https://leetcode-cn.com/problems/set-matrix-zeroes/
题目
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例1
输入
[[1,1,1],[1,0,1],1,1,1]]
输出
[[1,0,1],[0,0,0],[1,0,1]]
示例2
输入
[[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出
[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
O(M * N) 和 O (M + N) 的算法都很好想很好实现
想了想O(1) 的,一开始是想,把应该置成0的先置成一个极大值或者极小值,最后遍历一遍把那个值改为0
然而显然不可能这么简单,最后几个数据点里就有int的最小值导致本来不是0就第二遍遍历弄成0了
所以就用第一行和第一列来作标记,并且给第一行和第一列也分别作一个标记
如果matrix[i][j] 为0,令matrix[i][0] = 0, matrix[0][j] = 0
并且如果这一行或者这一列是0,相应的要做个标记,最后来处理0行和0列
代码
class Solution {
public:
const int NM = -2147483648;
void setZeroes(vector<vector<int>>& matrix) {
if (!matrix.size()) return ;
int m = matrix.size();
int n = matrix[0].size();
int flagi(0), flagj(0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j]) continue;
matrix[i][0] = 0;
matrix[0][j] = 0;
flagi += !i;
flagj += !j;
}
}
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 (flagj)
for (int i = 0; i < m; i++) matrix[i][0] = 0;
if (flagi)
for (int j = 0; j < n; j++) matrix[0][j] = 0;
return ;
}
};

本文介绍了一种原地算法,用于处理矩阵中元素为0的情况,通过标记所在行和列,将这些行和列的所有元素设为0。讨论了O(M*N)和O(M+N)算法的实现,并详细解析了一种利用第一行和第一列作为标记的O(1)额外空间复杂度算法。

被折叠的 条评论
为什么被折叠?



