力扣hot100:矩阵置零(73)(原地算法)

今天本来准备好好补一下智能客服项目的,但因为纳新网站占了不分时间没弄成,简单做了两个算法,看了下八股

问题描述
核心思路
  1. 标记需清零的行列

    • 创建两个布尔数组 arr(长度=行数)和 brr(长度=列数),分别标记需要清零的行和列。
    • 遍历矩阵,遇到元素为 0 时,将对应行索引在 arr 中标记为 true,列索引在 brr 中标记为 true
  2. 执行清零操作

    • 再次遍历矩阵,若当前行或列被标记为需清零,则将元素置为 0。

时间复杂度 :O(m × n) 空间复杂度:O(m + n)(两个额外数组)

代码实现
java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int x= matrix.length;
        int y=matrix[0].length;

        boolean[] arr = new boolean[x];
        boolean[] brr=new boolean[y];
        
        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                
                if(matrix[i][j]==0){
                    arr[i]=brr[j]=true;
                }
                
            }
        }

        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){

                if(arr[i]||brr[j]){
                    matrix[i][j]=0;
                }

            }
        }

    }
}
关键步骤解析
  1. 初始化标记数组

    • rowZero 数组标记需清零的行(长度为 m),colZero 数组标记需清零的列(长度为 n)。
    • 默认值均为 false,表示初始时无需清零。
  2. 第一次遍历:标记清零位置

    • 遍历每个元素 matrix[i][j],若值为 0,则设置 rowZero[i] = truecolZero[j] = true
    • 示例 : 矩阵 [[1,0,1],[1,1,1],[1,1,0]] 的标记结果为: rowZero = [true, false, true](第0行和第2行需清零) colZero = [true, false, true](第0列和第2列需清零)
  3. 第二次遍历:执行清零

    • 遍历每个元素,若 rowZero[i]colZero[j]true,则置零。
    • 逻辑解释
      • 若当前行需清零(rowZero[i]==true),则无论列是否标记,该行所有元素清零。
      • 若当前列需清零(colZero[j]==true),则无论行是否标记,该列所有元素清零。
示例演示

输入矩阵

java 复制代码
[
  [1, 0, 1],
  [1, 1, 1],
  [1, 1, 0]
]

标记过程

  1. 遍历到 (0,1)=0 → 标记 rowZero=true, colZero=true
  2. 遍历到 (2,2)=0 → 标记 rowZero=true, colZero=true

清零过程

  • 第0行:全部清零 → [0,0,0]
  • 第2行:全部清零 → [0,0,0]
  • 第1行:第1列被标记 → [1,0,1] → 但第1行未被标记,因此仅第1列清零 → [1,0,1] 变为 [1,0,1](实际不变)

输出矩阵

java 复制代码
[
  [0, 0, 0],
  [1, 0, 1],  // 第1列被标记清零,其他元素保留
  [0, 0, 0]
]
优化思考

虽然此解法空间复杂度为 O(m+n),但若追求 O(1) 空间,可将矩阵的第一行和第一列作为标记数组(需额外变量处理第一行/列的初始状态)。核心思想类似,但需注意边界条件,适合进阶挑战!

通过两个布尔数组的巧妙使用,我们高效地解决了矩阵置零问题。这种"标记-清零"的分步策略清晰易懂,是处理矩阵类问题的经典思路。

相关推荐
那年窗外下的雪.5 分钟前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
Wang's Blog9 分钟前
Java框架快速入门: Spring Security+OAuth2之多因子认证与TOTP实战
java·spring·ui
程序员20079 分钟前
AI 编程工具链碎片化?基于多端兼容的统一 Agent Rules 架构实践
后端
程序员200714 分钟前
拒绝 AI 代码“暗度陈仓”:工程级 AI 编码边界与防护规则设计
后端
yunwei3721 分钟前
eBPF 教程:追踪 CUDA GPU 操作
linux·后端·性能优化
滕州市燕猫虎计算机科技工作室个体工商户27 分钟前
Java面试题汇总
java·开发语言
搬搬砖得了34 分钟前
从“我写的”到“我懂它”——论工程师对代码的心理模型
后端
小满zs42 分钟前
Go语言第十二章(通道)
后端·go
林冠宏_指尖下的幽灵43 分钟前
AI发展下的后编程时代思考
前端·人工智能·后端
wzdark1 小时前
基于启发式搜索的最优路径规划算法研究4
算法