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;
            }
        }
    }
}
相关推荐
乐迪信息2 小时前
AI算法盒子船体烟火检测:港口火灾早预警
人工智能·深度学习·算法
lisw053 小时前
发酵算法两大应用方向解析
算法·数学建模
动词ing3 小时前
【题目练习】全排列
算法
易小尊4 小时前
Dixon-Coles 的 τ 函数,我写错了三次
算法
凯瑟琳.奥古斯特5 小时前
力扣1015C++解法技巧
c++·算法·leetcode·链表·职场和发展
seowmt5 小时前
GEO效果该什么时候看数据:从立项到复盘的时间线复盘
算法·ip·seo·geo·faq
悠仁さん5 小时前
【算法C++】双指针(一)
数据结构·c++·算法
小豆庄5 小时前
本地视频脱敏的追踪系统踩坑——车牌过滤、转场误判与ID冲突排查
人工智能·算法·目标检测·音视频·视频·敏捷流程·纹理贴图
忆挽篱笙歌5 小时前
进程替换函数与shenll命令行解释器
前端·javascript·算法
YukiRinLL5 小时前
字符串存储与 BF、KMP 匹配算法
数据结构·算法