算法练习第30题-零矩阵

203 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

一、题目

编写一种算法,若M × N矩阵中某个元素为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]
]

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…

来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

思路1

  • 定义数组col长度和row长度,同时定义横纵坐标出现0的位置
  • 这里通过new Array(colLen).fill(false),new Array(rowLen).fill(false)填充横纵坐标值
  • 定义了横纵坐标出现的位置
  • 这是我们再通过双层for循环,判断坐标出现ture的时候,将当前坐标的值的横纵坐标都改为0
  • 注意看给赋值0的判断
  • 如果 col[i]值为true或者row[j]值为true,任意条件成立。
  • 这里就可以给横纵坐标都赋值给0,这样就发现,横纵坐标都会得到修改。 注意:这里重要的是横纵坐标的标记,首先通过true标记其实已经得到了要想的数据,这里再通过二次的循环,将数据替换掉,得到真实答案。

三、代码

思路1代码

let setZeroes = function(matrix) {
  /**
   * 定义数组col长度和row长度,同时定义横纵坐标出现0的位置
   * 这里通过new Array(colLen).fill(false),new Array(rowLen).fill(false)
   * 定义了横纵坐标出现的位置
   * 
   * 这是我们再通过双层for循环,判断坐标出现ture的时候,将当前坐标的值的横纵坐标都改为0
   * 
   * */ 
  let colLen = matrix.length, rowLen = matrix[0].length
  let col = new Array(colLen).fill(false), row = new Array(rowLen).fill(false)
  for(let i = 0; i < colLen; i++) {
    for(let j = 0; j < rowLen; j++) {
      if(matrix[i][j] == 0) {
        col[i] = row[j] = true
      }
    }
  }
  for(let i = 0; i < colLen; i++) {
    for(let j = 0; j < rowLen; j++) {
      if(col[i] || row[j]) {
        matrix[i][j] = 0
      }
    }
  }

}
setZeroes(matrix)

四、测试结果

测试结果1

image.png