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 分钟前
LeetCode 热题 100——day7 接雨水
数据结构·c++·笔记·算法·leetcode·职场和发展
qeen8711 分钟前
【数据结构】搜索二叉树的介绍与算法原理解析及实现
数据结构·c++·学习·算法·模板
阳明山水26 分钟前
销量预测的“隐形杀手”:概念漂移与自适应学习实战
人工智能·深度学习·算法·机器学习·架构
szarron31 分钟前
HT666 0.6-6GHz 定向高增益手持天线:EMC 测试与频谱定位实战指南
网络·算法·5g·信号处理·射频工程·频谱仪
liulilittle42 分钟前
反量化:反量化Q8零(q8_0)
人工智能·算法·机器学习·ai·llm
青 春 记 忆7 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
Sagittarius_A*9 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
QAQo7T11 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai11 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场11 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces