[Java][Leetcode middle] 73. 矩阵置零

官解1: 使用第一行和第一列当作标记位

  • 使用第一行和第一列当作标记位
  • 另外用两个变量记录第一行第一列是否有0
java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
         if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return;
         int m = matrix.length;
         int n = matrix[0].length;

        boolean row0 = false;
        boolean col0 = false;
 
        // 记录第一行第一列元素是否包含0(因为第一行第一列元素会被后续覆盖)
        for(int i = 0; i<m;i++){
            if(matrix[i][0] == 0) {
                row0 = true;
                break;
            }
        }
        for(int j = 0; j<n;j++){
            if(matrix[0][j] == 0) {
                col0 = true;
                break;
            }
        }
        // 使用第一行第一列,标记从第二行第二列元素开始是否包含0
        for(int i = 1;i<m;i++){
             for(int j = 1;j<n ;j++){
                if(matrix[i][j] == 0){
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
             }
        }

        // 根据第一行、第一列的情况开始往矩阵中填充0
        for(int i = 1;i<m;i++){
            if(matrix[i][0] == 0){
                for(int j = 1;j<n;j++)  matrix[i][j] = 0;
            }
        }
        for(int j = 1;j<n;j++){
            if(matrix[0][j] == 0){
                for(int i = 1;i<m;i++)  matrix[i][j] = 0;
            }
        }

        // 处理第一行、列
        if(row0){
            for(int i= 0;i<m;i++)  matrix[i][0] = 0;
        }
        if(col0){
            for(int j = 0;j<n;j++)  matrix[0][j] = 0;
        }
    }
}

代码精简

这里:

java 复制代码
        // 根据第一行、第一列的情况开始往矩阵中填充0
        for(int i = 1;i<m;i++){
            if(matrix[i][0] == 0){
                for(int j = 1;j<n;j++)  matrix[i][j] = 0;
            }
        }
        for(int j = 1;j<n;j++){
            if(matrix[0][j] == 0){
                for(int i = 1;i<m;i++)  matrix[i][j] = 0;
            }
        }

也可以写成这样:

java 复制代码
        for(int i = 1;i<m;i++){
            for(int j = 1;j<n;j++){
                if( matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
        }

官解2: 仅使用一个变量col0

这个理解起来有点困难。

  • 循环置0时,从最后一行开始向前遍历:因为第一行是后面所有元素的标志位,如果先把第一行元素置0,后面所有元素都会变成0.
  • 为什么需要且仅需要一个标志变量col0:对于第一列来说,它的元素被覆盖用作行标识,所以需要一个变量来记录是否需要清零;而对第一行来说,虽然它被当作列标识,但是matrix00 作为第一行是否需要清零的标志,因此不需要额外的row0.
java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
         if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return; 
         int m = matrix.length;
         int n = matrix[0].length;

        boolean col0 = false;
 
        for(int i = 0; i<m;i++){
            // 第一列为0
            if(matrix[i][0] == 0)  col0 = true;
            for(int j = 1;j<n ;j++){
                if(matrix[i][j] == 0){
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }

       
        for(int i = m -1;i >= 0;i--){
            for(int j = n-1;j >= 1;j--){
                if( matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
            if(col0){
                matrix[i][0] = 0;
            }
        }
    }
}
相关推荐
蝶依斓(湖南)全案整装17 小时前
整装行业长尾需求内容矩阵搭建方法:从五个维度拆解用户需求
大数据·人工智能·矩阵
蜗牛互联网17 小时前
从GitHub动态工作流理解确定性编排与Agent判断边界
java·人工智能·后端·github
梦帮科技17 小时前
推测解码(Speculative Decoding)与 Draft-Target 双核协同:接受率判据、树状验证与两倍吞吐无损加速
网络·人工智能·深度学习·神经网络·线性代数·矩阵·架构
开开心心就好17 小时前
办公软件卸载不干净?专用工具一键清残留
java·前端·人工智能·智能手机·kafka·excel·memcache
大侠归来17 小时前
C 与 Go 语言对比:从设计哲学到工程实践
java·c语言·golang
吠品18 小时前
volatile到底在拦什么:SysTick->VAL读的哪格
java·服务器·开发语言
All for pursuit.18 小时前
【回溯-5】78.子集
数据结构·c++·算法·leetcode
新鲜势力呀18 小时前
PHP 定时任务系统实战:从 Cron 混乱执行到任务调度中心 + Redis队列 + 失败重试
android·java·redis
(Charon)19 小时前
【C/C++面试】手写内存池:从空闲链表到内存申请与释放
java·开发语言·windows
EatFan19 小时前
Spring Boot 4 迁移避坑清单:Jackson 3、starter 拆分与最低 JDK 口径核对(含若依/芋道/CRMEB 升级对照)
java·数据库·spring boot·spring boot 4·java 21·jakarta ee 11·jackson 3