标签:return param leetcode normal not nbsp etc 例子 ase
矩阵赋零。题意是给一个二维矩阵,如果其中有任何一个元素为0,请将0所在的行和列全都赋值为0。要求in-place做。例子,
Example 1:
Input: [ [1,1,1], [1,0,1], [1,1,1] ] Output: [ [1,0,1], [0,0,0], [1,0,1] ]Example 2:
Input: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] Output: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
数组类型的题有好几道都明确要求不能使用额外空间,这题也不例外。因为不能用到额外空间,所以只能将是否需要赋零的flag记录在input的数组里面,这里我选择记录在第一行和第一列上。但是我此时仍然需要两个flag来分别记录第一行和第一列上有没有0。因为第一行和第一列上的0有可能是因着记录里面的行和列的结果而被赋值成0的。
这个题需要对input数组扫描两次,第一次扫描的时候,当扫描到某个位置matrix[i][j]的时候,如果它是0,就需要把这个元素所在的行matrix[0][j]和列matrix[i][0]上的第一个元素也标记成0;同时判断如果当前位置的横坐标或者纵坐标是0的话,就需要把row或者column改成true。
第二次扫描的时候,需要从第二行和第二列开始扫描,如果碰到0,就把这个元素所在的行和列都赋值为0。最后再判断两个flag,如果flag为true,则需要把第一行或者第一列也赋值为0。
时间O(mn)
空间O(1)
1 /** 2 * @param {number[][]} matrix 3 * @return {void} Do not return anything, modify matrix in-place instead. 4 */ 5 var setZeroes = function (matrix) { 6 // corner case 7 if (matrix === null || matrix.length === 0) return; 8 9 // normal case 10 let m = matrix.length; 11 let n = matrix[0].length; 12 let row = false; 13 let col = false; 14 for (let i = 0; i < m; i++) { 15 for (let j = 0; j < n; j++) { 16 if (matrix[i][j] === 0) { 17 matrix[0][j] = 0; 18 matrix[i][0] = 0; 19 if (i === 0) row = true; 20 if (j === 0) col = true; 21 } 22 } 23 } 24 25 // starting from the seond row and second column 26 for (let i = 1; i < m; i++) { 27 if (matrix[i][0] === 0) { 28 for (let j = 1; j < n; j++) { 29 matrix[i][j] = 0; 30 } 31 } 32 } 33 for (let j = 1; j < n; j++) { 34 if (matrix[0][j] === 0) { 35 for (let i = 1; i < m; i++) { 36 matrix[i][j] = 0; 37 } 38 } 39 } 40 if (row) { 41 for (let j = 0; j < n; j++) { 42 matrix[0][j] = 0; 43 } 44 } 45 if (col) { 46 for (let i = 0; i < m; i++) { 47 matrix[i][0] = 0; 48 } 49 } 50 }
[LeetCode] 73. Set Matrix Zeroes
标签:return param leetcode normal not nbsp etc 例子 ase
原文地址:https://www.cnblogs.com/aaronliu1991/p/12306174.html