[73] 矩阵置零

105 阅读2分钟

思路

  • in-place instead.是不能拷贝一个新的数组,拷贝新数组是最简单的实现方式
  • 1.for循环第一行和第一列有没有0,有就标记对应的变量为true
  • 2.双层for循环遍历到0就把对应的第一列和第一行的元素变为0
  • 3.处理两个for循环标记的第一个元素,将其行和列都设置为0
  • 4.处理两个变量是否为true,是就把第一行和第一列都设置为0
/*
 * @lc app=leetcode.cn id=73 lang=javascript
 *
 * [73] 矩阵置零
 */

// @lc code=start
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 * in-place instead.是不能拷贝一个新的数组,拷贝新数组是最简单的实现方式
 * 1.for循环第一行和第一列有没有0,有就标记对应的变量为true
 * 2.双层for循环遍历到0就把对应的第一列和第一行的元素变为0
 * 3.处理两个for循环标记的第一个元素,将其行和列都设置为0
 * 4.处理两个变量是否为true,是就把第一行和第一列都设置为0
 */
var setZeroes = function (matrix) {
  let cloZero = false,
    rowZero = false
  // 1.看看第一行和第一列有没有出现0,出现就先标记为true,最后一步再处理
  // 标记第一列
  for (let i = 0; i < matrix.length; i++) {
    if (matrix[i][0] === 0) {
      cloZero = true
    }
  }
  // 标记第一行
  for (let i = 0; i < matrix[0].length; i++) {
    if (matrix[0][i] === 0) {
      rowZero = true
    }
  }
  // 2.标记第一行和第一列所以就从1开始,出现0就把第一行还有第一列的那个元素标记为0
  for (let row = 1; row < matrix.length; row++) {
    for (let col = 1; col < matrix[0].length; col++) {
      if (matrix[row][col] === 0) {
        matrix[0][col] = 0
        matrix[row][0] = 0
      }
    }
  }
  // 3.将第二步标记的第一个元素所在的行列都标记为0
  for (let row = 1; row < matrix.length; row++) {
    for (let col = 1; col < matrix[0].length; col++) {
      if (matrix[0][col] === 0 || matrix[row][0] === 0) {
        matrix[row][col] = 0
      }
    }
  }
  // 4.处理第一步标记的true,将其行列都置为0
  if (cloZero) {
    for (let i = 0; i < matrix.length; i++) {
      matrix[i][0] = 0
    }
  }
  if (rowZero) {
    for (let i = 0; i < matrix[0].length; i++) {
      matrix[0][i] = 0
    }
  }
  // 最后返回原数组
  return matrix
}
// @lc code=end