73. 矩阵置零

题目链接:力扣

解题思路:

方法一:比较容易想到的方向,使用两个数组row和col保存有0的行或者列,然后将有0的那一行或那一列的所有元素都设置为0

AC代码

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int x = 0;
        boolean[] row  = new boolean[matrix.length];
        boolean[] col = new boolean[matrix[0].length];

        for (int i = 0;i<matrix.length;i++){
            for (int j =0;j<matrix[0].length;j++){
                if (matrix[i][j]==0){
                    row[i]=true;
                    col[j]=true;
                }
            }
        }

        for (int i = 0;i<matrix.length;i++){
            for (int j =0;j<matrix[0].length;j++){
                if (row[i]||col[j]){
                    matrix[i][j]=0;
                }
            }
        }
    }
}

这种方式的时间复杂度为O(mn) ,空间复杂度为O(m+n)

解法二:空间复杂度为O(1)

可以使用矩阵的第一行和第一列来记录当前行或当前列是否需要更新

算法步骤:

  1. 遍历整个矩阵,如果某个元素为0,就将该元素所在的行和列的首元素标记为0,表示该行和列需要置0。但是需要使用两个额外的变量来记录原来的第一行和第一列是否有0。
  2. 更新时从第二行和第二列开始更新,如果某行或某列的首元素为0,说明该行或该列需要置0,
  3. 最后判断第一行和第一列是否需要置0

AC代码

java 复制代码
class Solution {
    public static void setZeroes(int[][] matrix) {
        boolean firstRow = false;
        boolean firstCol = false;
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                    if (i == 0) {
                        firstRow = true;
                    }
                    if (j == 0) {
                        firstCol = true;
                    }
                }
            }
        }
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }

        if (firstRow) {
            Arrays.fill(matrix[0], 0);
        }
        if (firstCol) {
            for (int i = 0; i < matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}
相关推荐
汉克老师31 分钟前
GESP6级C++考试语法知识(二十七、广度优先搜索(二、二维BFS))
c++·算法·图论·宽度优先·广度优先搜索·gesp6级·gesp六级
此生决int31 分钟前
算法从入门到精通——位运算
数据结构·c++·算法·蓝桥杯
春栀怡铃声32 分钟前
【C++修仙录02】筑基篇:vector 使用
开发语言·c++·算法
Loli_Wolf36 分钟前
AI 原生研发闭环:从提需到线上监测,再自动回到提需
人工智能·深度学习·算法·microsoft·ai·ai编程·harness
计算机安禾40 分钟前
【算法分析与设计】第4篇:分治策略的理论框架与经典案例
数据结构·算法·排序算法
Kiling_070441 分钟前
面向对象和集合编程题 ( 二 )
java·开发语言·数据结构·算法
过期动态1 小时前
【LeetCode 热题 100】两数之和— 暴力法与哈希表法详解
java·数据结构·算法·leetcode·散列表
葫三生1 小时前
开源社区为《论三生原理》系列提供“第二评价体系”?
人工智能·科技·深度学习·算法·机器学习·开源
故事和你911 小时前
洛谷-【动态规划1】动态规划的引入4
开发语言·数据结构·c++·算法·动态规划·图论
用户938515635071 小时前
移除数组里的指定元素,你学会了吗?
javascript·算法