LeetCode:矩阵置零

方法一:O(MN)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        
        //申请一个和原矩阵完全等大的新矩阵
        int[][] copy = new int[m][n];
        
        //把旧矩阵的数据原封不动地搬过来
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                copy[i][j] = matrix[i][j];
            }
        }
        
        //看着原矩阵 (copy) 找 0,在真实矩阵 (matrix)处理
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (copy[i][j] == 0) {
                    for (int k = 0; k < n; k++) {
                        matrix[i][k] = 0;
                    }
                    for (int k = 0; k < m; k++) {
                        matrix[k][j] = 0;
                    }
                }
            }
        }
    }
}

方法二:O(M+N)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        
        //记录每一行和每一列的状态
        //boolean数组默认全是false
        boolean[] rowDeathList = new boolean[m];
        boolean[] colDeathList = new boolean[n];
        
        //全矩阵扫描,填写状态
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rowDeathList[i] = true;
                    colDeathList[j] = true;
                }
            }
        }
        
        //根据状态给矩阵置0
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (rowDeathList[i] || colDeathList[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

方法三:O(1)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        //只用于处理第一列设置的变量
        boolean firstColHasZero = false;

        //遍历,在第一行和第一列置0(设置状态)
        for(int i = 0; i < m; i++){
            if(matrix[i][0] == 0){
                firstColHasZero = true;
            }

            for(int j = 1; j < n; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        //遍历,将需要的行和列置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(matrix[0][0] == 0){
            for(int j = 0; j < n; j++){
                matrix[0][j] = 0;
            }
        }

        if(firstColHasZero){
            for(int i = 0; i < m; i++){
                matrix[i][0] = 0;
            }
        }
    }
}

1.空间复杂度为O(MN)方法:开辟新的矩阵

2.空间复杂度为O(M+N)方法:两个一维数组用于行记录和列记录

3.空间复杂度O(1)将原数组的某部分当作状态数组

步骤:

(1)第一行/第一列专门记录哪行/列设为0

因为00既属于第一行又属于第一列,我们让它只管第一行,然后再引入一个变量firstColHasZero专门负责第一列

先扫第一列只要有0,直接将firstColHasZero置为true

因为第一列已经清楚了,所以直接从j=1开始往后扫,扫描中,只要ij为0,将i0,0j置为0

现在就统计好应该设为0的行和列了

(2)根据将刚才第一行第一列的状态,开始将矩阵符合条件的行列置为0,防止一上来将第一行第一列元素置为0导致后面元素误设为0,所以从i,j为1的位置开始

(3)最后处理第一行和第一列,00如果是0,将第一行置为0;firstColHasZero如果是true这一列直接置为0

相关推荐
xxxiugou1236 分钟前
链表算法题精讲:从两数相加到K组翻转
数据结构·c++·算法·链表
梦帮科技22 分钟前
量子纠缠网络与量子隐形传态攻防:量子中继器信道串扰、纠缠态保真度降解与量子路由劫持
开发语言·网络·人工智能·算法·自动化·php
老王IT42 分钟前
C语言语法基础语法介绍
c语言·开发语言·算法
cfm_29141 小时前
Leaf-segment号段模式
java
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友
paopaokaka_luck1 小时前
智慧电玩店管理系统(空闲机台随机分配、游玩时长概率模拟、积分自动结算、积分兑换闭环、 ECharts经营分析、 腾讯地图选址)
java·人工智能·mysql·echarts·推荐算法
m0_719640871 小时前
2026年适合课题研究的具身智能实验室建设方案有哪些可参考?
经验分享·算法
LMT流氓兔1 小时前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain
春弦_1 小时前
LeetCode Hot 100 刷题笔记
笔记·leetcode·哈希算法
zhangdaliangmvp1 小时前
快速排序的学习理解:从基础分治到三路划分优化
c++·学习·算法