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

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

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

三、结语

再见!

相关推荐
午彦琳10 分钟前
2026.9.17
数据结构·算法·leetcode
木井巳32 分钟前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
Sam_Deep_Thinking33 分钟前
new Thread()之后发生了什么?
java·后端·面试·程序员
八荒启·交互动画39 分钟前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
动恰客流统计41 分钟前
线下零售数字化浪潮下,客流统计的3个核心发展趋势
大数据·前端·人工智能
用户938515635071 小时前
从小米前端面试题,彻底搞懂闭包、作用域链与 useState 惰性初始化
前端·面试
怕浪猫2 小时前
从 Windows 换到 Mac 三个月,我真香了
算法·面试·架构
粥里有勺糖2 小时前
视野修炼第133期 | Native 回春了?
前端·github·agent
aichitang20242 小时前
前端小skill
前端·人工智能·算法·ai·前端框架
前端·柱子3 小时前
q-floodfill白边锯齿?一招搞定抗锯齿边缘问题
前端·html·canva可画