思路
- 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