一分钟解决一道算法题——矩阵置零

一、题目描述------矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

示例 1:

lua 复制代码
输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]

示例 2:

lua 复制代码
输入: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

二、题解(没错,这次的题解是完全自己写出来的,而且击败100.00%)

js 复制代码
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
    const ansSetI=new Set();
    const ansSetJ=new Set();
    for(let i=0;i<matrix.length;i++){
        for(let j=0;j<matrix[i].length;j++){
            if(matrix[i][j]===0){
                ansSetI.add(i);
                ansSetJ.add(j);
            }
        }
    }

    for(let i=0;i<matrix.length;i++){
        for(let j=0;j<matrix[i].length;j++){
            if( ansSetI.has(i)||ansSetJ.has(j)){
                matrix[i][j]=0;
            }
        }
    }

};

核心思想

利用两个集合(Set)分别记录需要置零的行索引和列索引。 第一遍扫描矩阵,记录下所有需要置零的行和列。 第二遍扫描矩阵,根据之前记录的行和列,将对应的元素置零。

详细步骤

  1. 初始化集合:

    • 创建两个 Set 对象 ansSetIansSetJ,分别用于存放需要置零的行索引和列索引。
  2. 扫描矩阵,记录零元素位置:

    • 使用嵌套循环遍历整个矩阵 matrix

    • 对于矩阵中的每个元素 matrix[i][j]

      • 如果 matrix[i][j] === 0,则将行索引 i 添加到 ansSetI,将列索引 j 添加到 ansSetJ
  3. 根据记录置零:

    • 再次使用嵌套循环遍历整个矩阵 matrix

    • 对于矩阵中的每个元素 matrix[i][j]

      • 如果 ansSetI.has(i)(当前行需要置零)或者 ansSetJ.has(j)(当前列需要置零),则将 matrix[i][j] 设置为 0

注意事项

  1. 空间复杂度: 由于使用了两个 Set 来存储行和列的索引,因此空间复杂度是 O(m + n),其中 m 和 n 分别是矩阵的行数和列数。 这题有O(1) space的解法,参见下面"优化方向"
  2. 原地修改: 题目要求 "Do not return anything, modify matrix in-place instead." 你的代码完全满足这个要求,直接修改了 matrix,而没有返回任何东西。
  3. 集合的优点: 使用 Set 的好处是可以自动去重。即使某一行或某一列有多个 0,也只会记录一次,避免重复操作。
  4. 可读性: 代码的可读性很高,变量命名清晰,逻辑也很直观。
  5. 时间复杂度: 代码的时间复杂度是 O(m * n),其中 m 和 n 分别是矩阵的行数和列数。 因为需要遍历矩阵两次。

三、结语

再见!

相关推荐
春日见1 小时前
丝滑快速拓展随机树 S-RRT(Smoothly RRT)算法核心原理与完整流程
人工智能·算法·机器学习·路径规划算法·s-rrt
Code小翊1 小时前
”回调“高级
算法·青少年编程
云里雾里!1 小时前
力扣 977. 有序数组的平方:双指针法的优雅解法
算法·leetcode·职场和发展
WYiQIU2 小时前
11月面了7.8家前端岗,兄弟们12月我先躺为敬...
前端·vue.js·react.js·面试·前端框架·飞书
谢尔登2 小时前
简单聊聊webpack摇树的原理
运维·前端·webpack
娃哈哈哈哈呀2 小时前
formData 传参 如何传数组
前端·javascript·vue.js
zhu_zhu_xia3 小时前
vue3+vite打包出现内存溢出问题
前端·vue
tsumikistep3 小时前
【前后端】接口文档与导入
前端·后端·python·硬件架构
行走的陀螺仪4 小时前
.vscode 文件夹配置详解
前端·ide·vscode·编辑器·开发实践
一只侯子4 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉