当前位置: 首页 > article >正文

LeetCode [中等]矩阵置零

73. 矩阵置零 - 力扣(LeetCode)

暴力解法

用两个标记数组分别记录每一行和每一列是否有零出现。

  • 遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。
  • 再次遍历该数组,用标记数组更新原数组即可。

时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。至多只需要遍历该矩阵两次。

空间复杂度:O(m+n),其中 m 是矩阵的行数,n 是矩阵的列数。需要分别记录每一行或每一列是否有零出现。

public class Solution {
    public void SetZeroes(int[][] matrix) {
        int m = matrix.Length, n = matrix[0].Length;
        bool[] row = new bool[m];
        bool[] col = new bool[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

使用两个标记变量

使用两个额外的变量记录原矩阵的第一行第一列是否包含0。之后便可以修改matrix[0][j]和 matrix[i][0]的数据。

用原矩阵的 第一行 matrix[0][j] 和第一列 matrix[i][0],来代替原来的两个标记数组,从而减少使用的空间。

public class Solution {
    public void SetZeroes(int[][] matrix) {
        int m = matrix.Length, n = matrix[0].Length;
        bool flagCol0 = false, flagRow0 = false;
        //第一列
        for(int i = 0; i < m; i++)
        {
            if(matrix[i][0] == 0)
            {
                flagCol0 = true;
                break;
            }
        }
        //第一行
        for(int j = 0; j < n; j++)
        {
            if(matrix[0][j] == 0)
            {
                flagRow0 = true;
                break;
            }
        }
        //从第二行第二列开始遍历矩阵,将0结点的行列保存在第一行第一列中
        for(int i = 1; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                if(matrix[i][j] == 0)
                    matrix[i][0] = matrix[0][j] = 0;
            }
        }

        //从第二行第二列开始遍历矩阵,根据第一行第一列中的的0修改
        for(int i = 1; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                if(matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;
            }
        }

        //修改第一列
        if(flagCol0)
        {
            for(int i = 0; i < m; i++)
                matrix[i][0] = 0;
        }
        
        //修改第一行
        if(flagRow0)
        {
            for(int j = 0; j < n; j++)
                matrix[0][j] = 0;
        }
    }
}

时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。我们至多只需要遍历该矩阵两次。

空间复杂度:O(1)。我们只需要常数空间存储若干变量。


http://www.kler.cn/a/159014.html

相关文章:

  • MongoDB在现代Web开发中的应用
  • 2.STM32之通信接口《精讲》之USART通信
  • java.sql.SQLException Parameter index out of range
  • WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇
  • 【Pikachu】XML外部实体注入实战
  • 整数唯一分解定理
  • html css 布局layout
  • JS箭头函数
  • 前端知识笔记(二十四)———快速创建桌面端(electron-egg)
  • java开发神器之ecplise的基本使用
  • 【蓝桥杯】马的遍历
  • 单机无锁线程安全队列-Disruptor
  • Django回顾6
  • Perl | Multi-line Strings | Here Document
  • 十种接口安全方案!!!
  • 解密IIS服务器API跨域问题的终极解决方案
  • CENTOS 7 添加黑名单禁止IP访问服务器
  • 云计算与低代码:加速应用开发与创新的双核引擎
  • CAD画图-模型和布局区别,视图命令MV使用(用于局部放大显示)
  • 【ArcGIS Pro】探索性插值无法覆盖所需shp范围
  • python基于轻量级卷积神经网络模型ShuffleNetv2开发构建辣椒病虫害图像识别系统
  • Landsat 5 C02数据集2007-2011年
  • 通俗讲解分布式锁:场景和使用方法
  • Python---魔术方法
  • 在AWS EC2中部署和使用Apache Superset的方案
  • 【开源】基于JAVA的校园疫情防控管理系统