给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法
要实现这个功能,我们可以使用原地算法。首先,我们需要两个额外的数组来记录哪些行和列需要被置为0。然后,我们遍历整个矩阵,如果发现某个元素为0,我们就将对应的行和列标记为需要置0。最后,我们再次遍历矩阵,根据之前的标记将相应的行和列置为0。
以下是js示例代码:
javascript
function setZeroes(matrix) {
const m = matrix.length;
const n = matrix[0].length;
const rows = new Array(m).fill(false);
const cols = new Array(n).fill(false);
// 第一步:找出哪些行和列需要置为0
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (matrix[i][j] === 0) {
rows[i] = true;
cols[j] = true;
}
}
}
// 第二步:根据标记将相应的行和列置为0
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (rows[i] || cols[j]) {
matrix[i][j] = 0;
}
}
}
}
// 测试示例
const matrix = [
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
];
setZeroes(matrix);
console.log(matrix); // 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]
这段代码首先创建了两个布尔数组 rows 和 cols,用于记录哪些行和列需要置为0。然后,它遍历整个矩阵,如果发现一个元素为0,就将对应的行和列标记为需要置0。最后,它再次遍历矩阵,根据之前的标记将相应的行和列置为0。
以下是python示例代码:
python
def setZeroes(matrix):
m, n = len(matrix), len(matrix[0])
rows, cols = set(), set()
# 记录哪些行和列需要被置为0
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
rows.add(i)
cols.add(j)
# 将包含0的行和列置为0
for i in range(m):
for j in range(n):
if i in rows or j in cols:
matrix[i][j] = 0
# 示例用法
matrix = [
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
]
setZeroes(matrix)
print(matrix) # 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]
在这个解决方案中,我们首先遍历整个矩阵以确定哪些行和列应该被设置为0。然后,我们再次遍历矩阵,并将这些行和列的所有元素设置为0。这种方法的时间复杂度是 O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。