LeetCode-中级-矩阵置零(JavaScript)

给定一个 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(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

思路:

这里只给出最优解,空间复杂度为O(1)。

本题的思路是用第一行来保存其余行中某列是否为0元素。例如:第二行第三列为0,则将第一行第三列置为0,然后将第二行全部置为0。行的方向判断完后,就看第一行哪些元素为0,将0元素所在的列置为0。

不过,直接这样会覆盖原先第一行本就有的0,所以一开始要先遍历第一行,只需记录第一行是否有0,在最后,再根据第一行是否有0,来决定第一行是否需要全部置为0。

于是,具体步骤如下:

1、遍历第一行,看有没有0

2、从第二行开始遍历,若当前行有0,则在第一行中对应列的元素变为0,并将该行都置为0

3、遍历第一行,将0元素所在的列都置为0

4、若第一行本就有0,则将第一行全部置为0

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
  let m = matrix.length,
      n = matrix[0].length
  let firstRowContains0 = false
  
//   遍历第一行,看有没有0
  for (let col = 0; col < n; col++) {
    if (matrix[0][col] === 0) {
      firstRowContains0 = true
      break
    }
  }
  
//   从第二行开始遍历
  for (let row = 1; row < m; row++) {
    let thisRowContains0 = false
//     若当前行有0, 则在第一行中对应列的元素变为0
    for (let col = 0; col < n; col++) {
      if (matrix[row][col] === 0) {
        matrix[0][col] = 0
        thisRowContains0 = true
      }
    }
//     若这行有0, 则把这一行都置为0
    if (thisRowContains0) {
      for (let col = 0; col < n; col++) 
        matrix[row][col] = 0
    }
  }
  
//   遍历第一行,将0元素所在的列都置为0
  for (let col = 0; col < n; col++) {
    if (matrix[0][col] === 0) {
      for (let row = 1; row < m; row++) {
        matrix[row][col] = 0
      }
    }
  }
  
//   最后,若第一行本来有0元素,就把第一行都置为0
  if (firstRowContains0) {
    for (let col = 0; col < n; col++)
      matrix[0][col] = 0
  }
};

执行用时112ms

全部评论

相关推荐

09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务