73. 矩阵置零( medium)给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请应用 原地 算法。
示例 1:
输出:matrix = [[1,1,1],[1,0,1],[1,1,1]]输入:[[1,0,1],[0,0,0],[1,0,1]]示例 2:
输出:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]输入:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提醒:
m == matrix.lengthn == matrix[0].length1 <= m, n <= 200-231 <= matrixi <= 231 - 1
进阶:
一个直观的解决方案是应用 O(mn) 的额定空间,但这并不是一个好的解决方案。一个简略的改良计划是应用 O(m + n) 的额定空间,但这依然不是最好的解决方案。你能想出一个仅应用常量空间的解决方案吗?
思路:用两个变量标记第一行和第一列是否有0,接着循环一遍矩阵,如果遇见0,将和这个网格雷同的第一行和第一列的元素标记成0,在循环矩阵,如果以后网格对应的第一行和第一列是0,则将这个单元格置为0。最初如果第一列有0 ,则将这第一列全副置为0,如果第一行有0 ,则将这第一行全副置为0复杂度:工夫复杂度O(mn),m、n为矩阵的行和列。空间复杂度O(1)js:
var setZeroes = function(matrix) { const m = matrix.length, n = matrix[0].length; let flagCol0 = false, flagRow0 = false;//示意第一行和第一列有没有0 for (let i = 0; i < m; i++) {//寻找第一列是否存在0 if (matrix[i][0] === 0) { flagCol0 = true; } } for (let j = 0; j < n; j++) { if (matrix[0][j] === 0) { flagRow0 = true; } } for (let i = 1; i < m; i++) {//循环矩阵,如果遇见0,将和这个网格雷同的第一行和第一列的元素标记成0 for (let j = 1; j < n; j++) { if (matrix[i][j] === 0) { matrix[i][0] = matrix[0][j] = 0; } } } for (let i = 1; i < m; i++) {//循环矩阵,如果以后网格对应的第一行和第一列是0,则将这个单元格置为0 for (let j = 1; j < n; j++) { if (matrix[i][0] === 0 || matrix[0][j] === 0) { matrix[i][j] = 0; } } } if (flagCol0) {//如果第一列有0 ,则将这第一列全副置为0 for (let i = 0; i < m; i++) { matrix[i][0] = 0; } } if (flagRow0) {//如果第一行有0 ,则将这第一行全副置为0 for (let j = 0; j < n; j++) { matrix[0][j] = 0; } }};133. 克隆图 (medium)给你无向 连通 图中一个节点的援用,请你返回该图的 深拷贝(克隆)。
...