矩阵-矩阵置零

矩阵置零

java 复制代码
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为
 0 。请使用 原地 算法。
 在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数
 量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部
 分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所
 (out-of-place)。


输入 :二维数组
输出 :二维数组
思路

方法一:使用两个标记数组

两个标记数组分别记录每一行和每一列是否有零出现,如果出现,则将对应的标记数组置为true,最后再次遍历数组,用标记数组更新原数组即可

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        //用变量定义数组的行和列的长度,方便写代码
        int m = matrix.length;
        int n = matrix[0].length;
        //定义标记数组
        boolean [] row = new boolean[m];
        boolean [] col = new boolean[n];
        //对标记数组进行赋值
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(matrix[i][j] == 0){
                    row[i] = col[j] = true;
                }
            }
        }
        //再次遍历,只要有一个标记为true,则置为0
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(row[i] || col[j]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

方法二:使用两个标记变量

使用矩阵的第一列和第一行去代替方法一中的标记数组,但是第一行和第一列的数值也会因此而改变,所以使用两个标记变量来第一行和第一列中原本是否包含0

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        //用变量定义数组的行和列的长度,方便写代码
        int m = matrix.length;
        int n = matrix[0].length;
        //定义标记变量
        boolean firstRow = false;
        boolean firstCol = false;
        //对标记变量进行赋值
        for(int i = 0;i < m;i++){
            if(matrix[i][0] == 0){
                firstCol = true;
            }
        }
        for(int i = 0;i < n;i++){
            if(matrix[0][i] == 0){
                firstRow = true;
            }
        }
        for(int i = 1;i < m;i++){
            for(int j = 1;j < n;j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        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;
                }
            }
        }
        //更新第一行第一列
        if(firstCol){
            for(int i = 0;i < m;i++){
                matrix[i][0] = 0;
            }
        }
        if(firstRow){
            for(int i = 0;i < n;i++){
                matrix[0][i] = 0;
            }
        }
    }
}

方法三:使用一个标记变量

第一列的第一个元素即可以标记第一行是否出现0。但为了防止每一列的第一个元素被提前更新,我们需要从最后一行开始,倒序地处理矩阵元素。

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        //用变量定义数组的行和列的长度,方便写代码
        int m = matrix.length;
        int n = matrix[0].length;
        //定义标记变量
        boolean firstColAndRow = false;
        //对标记变量进行赋值
        for(int i = 0; i < m; i++){
            if(matrix[i][0] == 0){
                firstColAndRow = true;
            }
            for(int j = 1; j < n; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        //倒序
        for(int i = m - 1; i >= 0; i--){
            for(int j = 1; j < n; j++){
                if(matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
            if(firstColAndRow){
                matrix[i][0] = 0;
            }
        }
        
    }
}
相关推荐
微尘寒风3 小时前
【Git】的安装和使用
java·git
y = xⁿ4 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
侧耳倾听1114 小时前
jwt使用简介
java·jwt
顶点多余5 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手5 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神5 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066496 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
yaoxin5211237 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F7 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
2601_962072218 小时前
SpringMVC进阶(自定义拦截器以及异常处理)
java