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;
            }
        }
    }
}
相关推荐
原来是猿20 分钟前
蓝桥备赛(四)- 数组(下)
开发语言·数据结构·c++·算法
ephemerals__31 分钟前
【数据结构进阶】哈希表
数据结构·算法·散列表
阿巴~阿巴~1 小时前
关于回溯算法中的剪枝是否需要for循环的总结归纳
数据结构·c++·算法·深度优先·剪枝
一只_程序媛1 小时前
【leetcode hot 100 42】接雨水
java·算法·leetcode
普通young man1 小时前
哈希封装unordered_map/unordered_set
算法·哈希算法
Dovis(誓平步青云)1 小时前
【数据结构】二叉树(门槛极低的系统理解)
c语言·数据结构·算法
朔北之忘 Clancy1 小时前
2022 年 12 月青少年软编等考 C 语言五级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
一只码代码的章鱼2 小时前
数据结构与算法-图论-最短路-floyd扩展
算法·图论
跳动的梦想家h2 小时前
hot100-矩阵
java·算法·矩阵
Liu_Meihao2 小时前
【算法】796. 子矩阵的和
算法