LeetCode.73 二维坐标转一维索引

929 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

最近在 LeetCode 刷题中,有一道题解决的比较满意,说来给大家分享一下。题目在这,73. 矩阵置零 感兴趣的小伙伴可以互动一下。

Quicker_20211002_191619.png

题目中给了常量空间的提示,我就没去想 n2 空间的方案,初步思路是这样的

  1. 遍历数组,找到 0 的位置 matrix[i][j]
  2. 转换二维坐标为一维索引
  3. 存入一个索引数组 zeros
  4. 读数组,解析索引
  5. 修改原数组

说一下步骤2. 转换二维坐标为一维索引,这一步应该是有名字的但是我忘记了他到底叫啥,有知道的好兄弟可以补充一下!具体实现是这样的:index = i * matrix[0].length + j,说人话就是 序号 = 横坐标 * 列数 + 纵坐标。解析的时候就反过来 i = index / matrix[0].length; j = index % matrix[0].length

开始撸第一波代码:

 /**
  * @param {number[][]} matrix
  * @return {void} Do not return anything, modify matrix in-place instead.
  */
 var setZeroes = function(matrix) {
     let zeros = []
     for (let i = 0; i < matrix.length; i++) {
         for (let j = 0; j < matrix[0].length; j++) {
             if (matrix[i][j] === 0) {
                 zeros.push(i * matrix[0].length + j)
             }
         }
     }
     zeros.forEach((val) => {
         matrix[val / matrix[0].length] = new Array(matrix[0].length).fill(0)
         for (let i = 0; i < matrix.length; i++) {
             matrix[i][val % matrix[0].length] = 0
         }
     })
 };

这一波代码有一点小错误在15行,因为 JavaScript 默认是浮点除法,所以结果可能就是一个小数然后在 matrix[] 中找到的就是 undefined

修改一下:

 zeros.forEach((val) => {
     matrix[Number.parseInt(val / matrix[0].length)] = new Array(matrix[0].length).fill(0)
     for (let i = 0; i < matrix.length; i++) {
         matrix[i][val % matrix[0].length] = 0
     }
 })

其实这样也不是很明智,Number.parseInt() 的参数其实是 String,总之这不是一个好的解决方案。

再改一下:

 zeros.forEach((val) => {
     matrix[Math.floor(val / matrix[0].length)].fill(0)
     for (let i = 0; i < matrix.length; i++) {
         matrix[i][val % matrix[0].length] = 0
     }
 })

因为都是数字运算,所以我们使用Math.floor()不仅会快一点而且还更容易读代码。

整体代码就是这样的:

 /**
  * @param {number[][]} matrix
  * @return {void} Do not return anything, modify matrix in-place instead.
  */
 var setZeroes = function(matrix) {
     let zeros = []
     for (let i = 0; i < matrix.length; i++) {
         for (let j = 0; j < matrix[0].length; j++) {
             if (matrix[i][j] === 0) {
                 zeros.push(i * matrix[0].length + j)
             }
         }
     }
     zeros.forEach((val) => {
         matrix[Math.floor(val / matrix[0].length)].fill(0)
         for (let i = 0; i < matrix.length; i++) {
             matrix[i][val % matrix[0].length] = 0
         }
     })
 ​
 };

看一下结果还不错,哈哈哈~

Quicker_20211002_195654.png

\