给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法
要实现这个功能,我们可以使用原地算法。首先,我们需要两个额外的数组来记录哪些行和列需要被置为0。然后,我们遍历整个矩阵,如果发现某个元素为0,我们就将对应的行和列标记为需要置0。最后,我们再次遍历矩阵,根据之前的标记将相应的行和列置为0。
以下是js示例代码:
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);// 第一步:找出哪些行和列需要置为0for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {if (matrix[i][j] === 0) {rows[i] = true;cols[j] = true;}}}// 第二步:根据标记将相应的行和列置为0for (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示例代码:
def setZeroes(matrix):m, n = len(matrix), len(matrix[0])rows, cols = set(), set()# 记录哪些行和列需要被置为0for i in range(m):for j in range(n):if matrix[i][j] == 0:rows.add(i)cols.add(j)# 将包含0的行和列置为0for 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 是矩阵的列数。