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

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

给定一个 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 分别是矩阵的行数和列数。 因为需要遍历矩阵两次。

三、结语

再见!

相关推荐
岁岁种桃花儿21 小时前
SpringCloud超高质量面试高频题300道题
spring·spring cloud·面试
yongui4783421 小时前
混凝土二维随机骨料模型 MATLAB 实现
算法·matlab
酉鬼女又兒21 小时前
JAVA牛客入门11~20
算法
星夜落月21 小时前
Web-Check部署全攻略:打造个人网站监控与分析中心
运维·前端·网络
努力学算法的蒟蒻21 小时前
day75(2.3)——leetcode面试经典150
面试·职场和发展
代码游侠21 小时前
C语言核心概念复习(二)
c语言·开发语言·数据结构·笔记·学习·算法
冰暮流星21 小时前
javascript之双重循环
开发语言·前端·javascript
爱敲点代码的小哥21 小时前
C#视觉模板匹配与动态绘制实战(绘制和保存,加载tb块,处理vpp脚本的方式)
前端·javascript·信息可视化
XX風1 天前
2.1_binary_search_tree
算法·计算机视觉
不想写bug呀1 天前
买卖股票问题
算法·买卖股票问题