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

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

给定一个 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 小时前
一、react18+项目初始化(vite)
前端·react.js
凌肖战1 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
ai小鬼头1 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
weixin_478689762 小时前
十大排序算法汇总
java·算法·排序算法
luofeiju2 小时前
使用LU分解求解线性方程组
线性代数·算法
墨菲安全2 小时前
NPM组件 betsson 等窃取主机敏感信息
前端·npm·node.js·软件供应链安全·主机信息窃取·npm组件投毒
GISer_Jing2 小时前
Monorepo+Pnpm+Turborepo
前端·javascript·ecmascript
天涯学馆2 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
SKYDROID云卓小助手2 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
ysa0510303 小时前
数论基础知识和模板
数据结构·c++·笔记·算法