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;
            }
        }
    }
}
相关推荐
语戚5 分钟前
力扣 494. 目标和 —— 回溯 & 动态规划双解法全解(Java 实现)
java·算法·leetcode·动态规划·力扣·dp·回溯
北顾笙98010 分钟前
day23-数据结构力扣
数据结构·算法·leetcode
Robot_Nav12 分钟前
RC-ESDF 详解:以机器人为中心的欧几里得有符号距离场
人工智能·算法·机器人
田梓燊31 分钟前
leetcode 234
算法·leetcode·职场和发展
Aaron158834 分钟前
RFSOC+VU13P中在线部分可重构技术的应用分析
人工智能·算法·matlab·fpga开发·重构·信息与通信·信号处理
yashuk40 分钟前
C语言入门教程:程序结构与算法举例
c语言·算法·教程·程序设计·开发过程
zsc_11843 分钟前
pvz3解码小游戏求解算法 (二)
算法
hanbr1 小时前
每日一题day1(Leetcode 76最小覆盖子串)
算法·leetcode
AI科技星1 小时前
张祥前统一场论中两个电荷定义的统一性解析
开发语言·线性代数·算法·数学建模·平面
代码地平线1 小时前
C语言实现堆与堆排序详解:从零手写到TopK算法及时间复杂度证明
c语言·开发语言·算法